Effective C++: Item01 ~ Item04

Item01:C++是一門多範式編程語言

  • 面向過程
  • 面向對象
  • 泛型編程
  • STL

Item02:儘量以const、enum、inline替換#define

  • #define 是由預編譯器處理的,所以定義的一些常量名不會出現在編譯階段的符號表裏,這樣在編譯報錯的時候,定位出錯位置將耗費時間。

    推薦:使用const常量替代#deifine定義常量。

  • 當類的普通成員需要依賴於類的靜態成員時,可以使用enum替代。

    class GamePlayer 
    {
    public:	
        static int number;
    	enum { NUM = 10 };
    	int scores[NUM]; // 這裏的NUM不能使用static成員實現,因爲類定義中靜態成員只是聲明,靜態成員的實現是在類外部。
    };
    int GamePlayer::number = 10;
    
  • #define經常被用來實現宏函數,但是因爲它只是單純的文本的替換,所以使用要十分小心。

    推薦:使用inline替代宏函數。

Item03:儘可能使用const

  • const修飾指針變量時,在*左邊表示指針所指的內容不可變,在右邊表示指針自身不可變。

  • const可以修飾一個函數的返回值、參數、函數自身(成員函數)。

    class Rational { ... };
    const Rational operator* (const Rational &lhs, const Rational &rhs);
    // 返回const修飾的返回值,可以避免以下情況的發生:
    Rational a, b;
    (a * b) = c; // error, (a * b)的結果是const的
    // 這有利於在條件判斷中將==誤寫爲=時及時發現錯誤
    
  • const成員函數和non-const成員函數可以構成重載,在對const對象調用函數時,調用const成員函數。

  • 通過向成員變量添加mutable修飾符,使得const成員函數內部可以修改成員變量。

  • 當const和non-const成員函數有着實質等價的實現時,令non-const調用const版本可以避免代碼重複。

Item04:確定對象在使用之前已被初始化

  • 在類的構造函數內完成所有成員(內置類型和自定義類型)的初始化(使用初始化列表,而不是在構造函數中賦值)。

  • 注意區分初始化和賦值的區別。

  • 基類的初始化總是優先於派生類的初始化,成員變量的初始化順序與聲明的順序相同。

  • 編譯單元:產出單一目標文件的源碼。

  • 無法確定不同編譯單元內non-local static對象的初始化順序。

    B b; // B是另一個文件中的全局變量(non-local static)
    
    
    class A
    {
    public:
    	A() { b.init(); } // 這裏在調用的時候,並不能保證b已經初始化了	
    };
    

    解決辦法:通過定義一個函數將non-local static對象作爲返回值返回。

    B& getB()
    {
    	static B b;
        return b;
    }
    
    // 在A中通過getB()就可以獲得初始化後的對象。
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章