類
構造函數中的工作
- 通常,構造函數中只對成員變量設置初值,複雜的初始化請使用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行應考慮是否可以拆開。