1. 構造函數的職責
如果對象需要進行有意義的(non-trival)初始化,考慮使用明確的init()的方法來進行初始化操作。因為如果在構造函數中進行有意義的初始化操作,一旦這些操作失敗,對象將進入不確定的狀態。symbian編程中廣泛使用一種稱為“兩階段構造法”的方法來解決這個問題,值得借鑒。
2. 默認構造函數
如果一個類定義了很多數據成員,那么就自己寫一個構造函數,因為如果不自己寫,編譯器會產生一個垃圾的默認構造函數,這應該不是你想要的。
new 一個不帶參數的類對象時, 會調用類的默認構造函數. 用
new[] 創建數組時,默認構造函數則總是被調用。保證對象的構造要有意義。
3. 對單個參數的構造函數使用explicit關鍵字。
如果C++的構造函數只有一個參數,那么就會有一個對應的“隱式轉換”。即:將該構造函數中參數的數據類型對應的數據轉換為該類的對象。這么說有點繞,舉個例子就明白了:
class IntCls
{
public:
IntCls(int m);
};
IntCls ic = 10; // Convert 10 to IntCls
// convert:
// IntCls tmp = IntCls(10);
// ic = tmp
4.拷貝構造函數
僅在代碼中需要拷貝一個類對象的時候使用拷貝構造函數。大部分類并不需要可拷貝, 也不需要一個拷貝構造函數或重載賦值運算符。
// 禁止使用拷貝構造函數和 operator= 賦值操作的宏
// 應該類的 private: 中使用
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
在class Foo 中:
class Foo {
public:
Foo(int f);
~Foo();
private:
DISALLOW_COPY_AND_ASSIGN(Foo);
};
5. 結構體
僅當只有數據時使用
struct, 其它一概使用
class.