作者:LogM
本文原載於 https://segmentfault.com/u/logm/articles,不允許轉載~
1. 讓自己習慣C++
-
1.1 條款01:視C++爲語言聯邦
-
1.2 條款02:儘量以const, enum, inline替換 #define
-
1.2.1 #define用於常量的場景
-
缺點:
- a. #define定義的常量導致編譯出錯時,出錯提示不友好;
- b. #define無視作用域(scope),無封裝性。
-
解決:
- a. 大多數情況可以用const替換;
- b. 舊編譯器對類內static const語法較苛刻,此時可用enum替換#define。
-
-
1.2.2 #define用於宏(函數)的場景
-
缺點:
- a. 需要注意括號的使用,給自己添麻煩;
- b. #define無視作用域(scope),無封裝性。
- 解決:使用inline函數。
-
-
-
1.3 條款03:儘可能使用const
- 原因:讓編譯器輔助對常量/常量函數的錯誤使用。
-
1.3.1 const常量
-
const char* p = ...; // p可改變,*p不可改變 char const * p = ...; // 同上,有些人會這麼寫 char* const p = ...; // p不可改變,*p可改變 const char* const p = ...; // p不可改變,*p不可改變 const std::vector<int>::iterator iter = ...; // iter不可改變,*iter可改變 std::vector<int>::const_iterator iter = ...; // iter可改變,*iter不可改變 const Rational operator* (const Rational& lhs, const Rational& rhs); // 用於避免出現 (a * b) = c 這樣的代碼
-
-
1.3.2 const函數
-
bool func(int a, int b) const; // const表示該函數不改變類中的成員變量,mutable修飾的成員變量除外
-
-
1.4 條款04:對象使用前先初始化
- 內置變量類型在聲明時初始化;
- 用戶創建的類在構造函數用初始化列表初始化(注意:初始化順序爲成員變量的聲明順序有關,與初始化列表如何排列無關);
- 不同編譯單元的non-local static對象的初始化順序不確定,儘量使用local static對象代替。