第一章 讓自己習慣C++
條款01:視C++為一個語言聯邦
條款02:盡量以const, enum, inline替換#define
n 對於單純常量,最好以const對象或enums替換#define
n 對於形似函數的宏,最好改用inline函數替換#define
第一,用define時,記號名稱由前置處理器處理,沒被編譯器看見,記號名稱不進入symbol table內,出現編譯錯誤時,可能帶來困惑。
第二,define不重視範圍,不能用define建立一個class專屬常量。不能提供任何封裝性
第三,define函數時,也會帶來麻煩,如f(++a),可能會多次執行++a
條款03:儘可能使用const
n const可被施加於任何範圍內的對象、函數參數、函數傳回型別、成員函數本體
n 當const和non-const成員函數有著實質等價的實現時,令non-const版本調用const版本可避免代碼重複。
如果關鍵字const出現在星號左邊,表示被指物是常量;如果出現在星號右邊,表示指標自身是常量;
聲明為const指標,表明指標不得指向不同的東西,但它所指的東西的值可以改動。
const成員函數:可以確認該成員函數可作用於const對象。也表明該函數不能更改對象的任何成員變數(static除外)。
可以用mutable修飾變數,來釋放掉non-static成員變數的bitwise constness約束(const函數中可以修改mutable變數)
轉型const_case: 將const變數轉為非const。static_cast: 顯示的轉型。
條款04:確定對象被使用前已被初始化
n 為內建型對象進行手工初始化
n 建構函式最好使用成員初值列,而不要在建構函式本體內使用賦值操作(效率高)
確定每一個建構函式都將對象的每一個成員初始化
不要混淆了賦值和初始化。
在C++規定,對象的成員變數的初始化動作發生在進入建構函式本體之前。用member initialization list(成員初值列)。
C++的成員初始化次序:base classes早於其derived classes。而class的成員變數總是以其聲明次序被初始化。