1. 構(gòu)造函數(shù)的職責(zé)
如果對(duì)象需要進(jìn)行有意義的(non-trival)初始化,考慮使用明確的init()的方法來(lái)進(jìn)行初始化操作。因?yàn)槿绻跇?gòu)造函數(shù)中進(jìn)行有意義的初始化操作,一旦這些操作失敗,對(duì)象將進(jìn)入不確定的狀態(tài)。symbian編程中廣泛使用一種稱(chēng)為“兩階段構(gòu)造法”的方法來(lái)解決這個(gè)問(wèn)題,值得借鑒。
2. 默認(rèn)構(gòu)造函數(shù)
如果一個(gè)類(lèi)定義了很多數(shù)據(jù)成員,那么就自己寫(xiě)一個(gè)構(gòu)造函數(shù),因?yàn)槿绻蛔约簩?xiě),編譯器會(huì)產(chǎn)生一個(gè)垃圾的默認(rèn)構(gòu)造函數(shù),這應(yīng)該不是你想要的。
new 一個(gè)不帶參數(shù)的類(lèi)對(duì)象時(shí), 會(huì)調(diào)用類(lèi)的默認(rèn)構(gòu)造函數(shù). 用
new[] 創(chuàng)建數(shù)組時(shí),默認(rèn)構(gòu)造函數(shù)則總是被調(diào)用。保證對(duì)象的構(gòu)造要有意義。
3. 對(duì)單個(gè)參數(shù)的構(gòu)造函數(shù)使用explicit關(guān)鍵字。
如果C++的構(gòu)造函數(shù)只有一個(gè)參數(shù),那么就會(huì)有一個(gè)對(duì)應(yīng)的“隱式轉(zhuǎn)換”。即:將該構(gòu)造函數(shù)中參數(shù)的數(shù)據(jù)類(lèi)型對(duì)應(yīng)的數(shù)據(jù)轉(zhuǎn)換為該類(lèi)的對(duì)象。這么說(shuō)有點(diǎn)繞,舉個(gè)例子就明白了:
class IntCls
{
public:
IntCls(int m);
};
IntCls ic = 10; // Convert 10 to IntCls
// convert:
// IntCls tmp = IntCls(10);
// ic = tmp
4.拷貝構(gòu)造函數(shù)
僅在代碼中需要拷貝一個(gè)類(lèi)對(duì)象的時(shí)候使用拷貝構(gòu)造函數(shù)。大部分類(lèi)并不需要可拷貝, 也不需要一個(gè)拷貝構(gòu)造函數(shù)或重載賦值運(yùn)算符。
// 禁止使用拷貝構(gòu)造函數(shù)和 operator= 賦值操作的宏
// 應(yīng)該類(lèi)的 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. 結(jié)構(gòu)體
僅當(dāng)只有數(shù)據(jù)時(shí)使用
struct, 其它一概使用
class.