【讀書筆記】Effective C++(01)讓自己習慣C++

作者:LogM

本文原載於 https://segmentfault.com/u/logm/articles,不允許轉載~

1. 讓自己習慣C++

  • 1.1 條款01:視C++爲語言聯邦

    • 1.1.1 C++的發展:

      • 階段1:C with Classes;
      • 階段2:加入異常(exceptions)、模板(templates)、STL庫;
      • 階段3:過程形式 + 面向對象形式 + 函數形式 + 泛型形式 + 元編程形式
    • 1.1.2 如何使用:視爲四個次語言的組合

      • C。最基礎的C。
      • 面向對象的C。C with Classes。
      • Template C++。泛型編程,更深奧的還有模板元編程(TMP),但一般人用不到。
      • STL。作者認爲STL有自己的一套規約,可以單獨拎出來。
  • 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對象代替。
發佈了52 篇原創文章 · 獲贊 19 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章