第二章 保持兼容
- 預定義宏:通過預定義宏,#ifdef #endef等預處理命令,完成代碼的平臺性支持;
- func : 反回所在函數名字
#progma
一條預處理指令,
#progma once
:告訴編譯器,該頭文件只被編譯一次
等同與:
#ifndef THIS_HEADER
#define THIS_HEADER
// 一些頭文件;
#endif
變長參數的宏定義和VA_ARGS: (P41)
FILE, LINE寬窄字符串的鏈接
char - wchar_t:先轉換,再鏈接long long:在不同的平臺上,可以有不同的長度,但至少是64位
long long; unsigned long long ;
信息在中,記錄了LLONG_MIN,LLONG_MAX,ULL_MAX(P42)整形的提升:Integral promotion:
轉化規則:低等級的整形轉化成高等及的,有符號的轉換爲無符號的。__cplusplus
,用來檢測編譯器支持的板本,可以使用#error報錯靜態斷言:斷言並不是程序運行時所需要的,而是幫助程序調試。C++ 提供標準assert宏,幫助程序斷言。
可以使用宏NDEBUG 來禁用宏assert;快速初始化成員變量:
- 非靜態成員的sizeof:c++11支持對類中非靜態成員使用sizeof
- friend 類友元的聲明不再需要使用關鍵字class,而且可以聲明一個類的別名爲類友元;
- 虛函數就是給派生類用來重載的。如果不想讓派生類來重寫,就定義爲非虛函數。
- final 關鍵字的作用,是禁止派生類重寫final所修飾的需函數,C++11借鑑了java的這種方式。在派生類的過程中,通過final可以任意的終止一個接口的可重載性。
- 派生類在虛函數聲明時使用了描述符override,那麼派生類必須重寫其基類中同名函數,否則代碼無法編譯通過。解決繼承結構長、接口錯誤等問題。
extern,外部變量聲明:
extern int i; // 在聲明處的文件的數據區,不會存在這個變量i ;
類似外部變量,也存在“外部模板”的問題。在不同的代碼文件中調用func傳入相同類型的參數,會出現多個相同的函數實例。
template <typename T> void func(T){}
連接器通過編譯器的輔助手段,會把重複的模板函數刪除。
使用“外部模板”,可以省略編譯器的實例化和連接器的刪除。節省編譯器和連接器的時間消耗。顯示實例化(explicit instantiation):
template void func<int>(int);
- 外部模板聲明
extern template void func<int>(int);
第三章 通用爲本,專用爲末
- 繼承構造函數
- C++自定義類型:類!是C++面向對象的基礎。
- 類可以自動獲得基類的成員變量和接口,(虛函數,純虛函數,public派生類);
- 類的非虛函數無法被派生類使用,包括構造函數;
- using::聲明派生類使用基類的成員函數;(76);
- 基類的構造函數有默認的參數,派生類不會繼承構造函數的默認參數;默認參數會導致多個構造函數的產生。
1.
委派構造函數
public: Info() {InitReset();}; Info(int i):Info() {type = i;}; Info(char e):Info() {name = e;}; // 委派構造函數:目標構造函數(初始化列表位置)
- 委派構造:委派函數將構造任務委派給目標函數來完成類的這樣一種構造方式。
移動語義:
- 懸掛指針,不在指向有效的內存,在懸掛指針上釋放內存會產生嚴重的錯誤。
- 移動語言:算了吧,沒看懂,下次再看;(91)
坐值,右值,右值引用
- 可以取地址,有名字的是左值,反之是右值
- C++11中,右值有兩個概念:將亡值,純右值;
- C++11中,所有的值屬於,左值,將亡值,純右值,三者之一(94);
- 左值引用和右值引用都是引用類型
- 左值引用是具名變量值的別名,右值引用是不具名(匿名)變量的別名。(100)