條款 1:視 C++ 為一個語言聯邦#
除了過程、對象、模板、函數四種編程範式,還有元編程形式,其可包括在泛型編程裡,即模板;STL 就是元編程的一個典範
- 可體會學習 C++ 的方法
條款 2:盡量以 const/enum/inline 替換 #define#
能不用 #define 就不用,為了方便調試;而用 define 容易掩蓋錯誤,因為所有宏對編譯器不可見
- 對於單純常量,最好用 const 對象或者 enums
- 對於形似函數的宏,最好用 inline 函數
條款 3:盡可能使用 const#
數據意義上的 const VS. 邏輯意義上的 const
- 編譯器強制實施前者,我們編寫程序時使用後者
- 前者:真正數據意義上的 const 是很難實現的,涉及到指針,可能通過其他方式改變數據
- 後者:核心的數據沒變,就可以認為是邏輯意義上的 const
PS:const 對象和方法
- const 對象:不能調用非 const 方法,因為非 const 方法內的變量可能發生改變
- const 方法
- 內部是不能修改成員屬性的
- mutable 變量:邏輯上的 const,雖然變量可改變,但不是核心數據
條款 4:確定對象被使用前已經先被初始化#
1、手動初始化內置型對象
- C++ 並不保證會初始化內置型對象
2、構造函數的賦值最好使用初始化列表
- 初始化列表調用的是構造函數
- 構造函數和賦值運算符在 C++ 中完全是兩個概念
- 構造函數主要負責對象初始化
- 初始化列表(初值列)列出的成員順序應該與它們在類內聲明的順序一致
- 所見順序即實際順序,方便維護
- 即使反著寫,程序還是按照聲明順序初始化變量
- 減少 “跨編譯單元之初始化次序” 問題,以 local static 對象替換 non-local static 對象
- 盡量跨文件初始化的依賴關係