Google C++ Style Guide 閱讀筆記 4

構造函數中的工作

  • 通常,構造函數中只對成員變量設置初值,複雜的初始化請使用Init().
    • 信號錯誤難以處理,禁止使用exceptions.
    • 如果初始化失敗,那對象就創建失敗了,造成未知狀態。
    • 如果在構造函數中調用虛函數,這些調用不能傳給子函數的實現。即使現在沒有子函數,但對以後的優化造成隱患。
    • 如果其中調用了全局變量,構造將在main()之前進行,可能導致構造函數中的隱式假設失敗,比如全局變量初始化失敗。
  • 總結:如果你的對象不處理複雜的初始化,請顯式地使用Init(),在構造函數裏不要調用虛函數,不要拋出錯誤,不要訪問未初始化的全局變量。

默認構造器

  • 必須定義一個默認構造器,如果類中定義了成員變量並且沒有其他構造器,如若不然,編譯器將爲你做這個工作,但可能不夠好。
  • 調用new[]構建向量的時候,構造器將總是被調用。
  • 初始化結構體,hold住“不可能”的值,讓調試簡單。
  • 如果你的類是繼承來的且沒有添加新的成員變量,那麼不需要默認的構造器。

顯式構造器

  • 使用 eplicit 避免自動的不符合要求的類型轉換。
  • 我們要求單變量的構造器必須是顯式的。

複製構造器

  • 只在需要的時候使用,否則用DISALLOW_COPY_AND_ASSIGN關掉該功能。
  • 在創建對象副本的時候複製構造器和賦值操作將被進行。比如用按值傳遞對象。
  • 多數情況使用指針或者引用就夠了。
  • 可以創建CopyFrom()或者Clone()方法。
    `#define DISALLOW_COPY_AND_ASSIGN(TypeName)\
    TypeName(const TypeName&);\
    void operator= (const TypeName&)
    Class Foo {
    public:
    Foo(int f);
    ~Foo();
    private:
    DISALLOW_COPY_AND_ASSIGN(Foo);
    };

結構體和類

  • 僅存儲數據的對象使用結構體,其他情況都用類。

繼承

  • 子類不能重載非虛函數。
  • 具有“is-a”關係的類才能用於繼承。
  • 如果類中含有虛函數,那麼析構函數也寫成虛函數。

接口

  • 具有如下條件的類是一個純接口:
    • 只有public純虛方法和靜態方法。
    • 沒有非靜態數據成員。
    • 沒有定義任何構造器,如果提供了一個構造器,他必須沒有參數且爲protected.
    • 如果是子類,它必須繼承於具有這些條件的類並且加上Interface前綴。

操作符重載

  • 特殊情況外不要重載操作符。
  • 爲了讓一些模板函數工作正常,你可能需要重載操作符。
  • 儘量用Equal(),CopyFrom()替代重載操作,如果需要前置定義,避免使用一元操作符operator&。

聲明順序

  • public在private前面,方法在變量前面。
  • public -> prtected ->private,每個部分按如下順序:
    • Typedef 和枚舉
    • 常量(static const 數據成員)
    • 構造函數
    • 析構函數
    • 方法,包含靜態方法
    • 數據成員
  • 友元在private中聲明,DISALLOW_COPY_AND_ASSIGN在private的末尾。

寫短函數

  • 函數超過40行應考慮是否可以拆開。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章