構(gòu)造/析構(gòu)/賦值運(yùn)算
條款05
了解C++默默編寫(xiě)并調(diào)用了哪些函數(shù)
編譯器可以暗自創(chuàng)建default構(gòu)造函數(shù),copy構(gòu)造函數(shù),copy assignment操作符以及析構(gòu)函數(shù)(C++11后添加了默認(rèn)移動(dòng)構(gòu)造函數(shù)和默認(rèn)移動(dòng)操作符);
即:
class Empty { } ;
經(jīng)編譯器處理后等價(jià)于(只有這些函數(shù)被調(diào)用時(shí)才創(chuàng)建):
class Empty {
public: //注意是public
Empty () { ... } //只處理非靜態(tài)成員
Empty (const Empty& rhs) { ... }
~Empty () { ... }
Empty& operator=(const Empty& rhs) { ... }
};
條款06
若不想使用編譯器自動(dòng)生成的函數(shù),就應(yīng)明確拒絕
可以將相應(yīng)成員函數(shù)聲明為private并且不予實(shí)現(xiàn)即可達(dá)到目的;(調(diào)用會(huì)引起linkage error)
C++11中存在更好的解決方案,即還函數(shù)聲明后添加 = delete
條款07
為多態(tài)基類聲明virtual析構(gòu)函數(shù)
帶多態(tài)性質(zhì)的base class應(yīng)聲明一個(gè)virtual析構(gòu)函數(shù);如果class帶有任何virtual函數(shù),它都應(yīng)具有一個(gè)virtual析構(gòu)函數(shù);
含有virtual函數(shù)的對(duì)象在體積上上會(huì)有明顯的增加,所以,若class的設(shè)計(jì)不是作為base class或不是為了具有多態(tài)性,析構(gòu)函數(shù)就不要成為virtual;
對(duì)于C++11,要用好final,override等關(guān)鍵字
條款08
別讓異常逃離析構(gòu)函數(shù)
C++不喜歡析構(gòu)函數(shù)吐出異常;
若要對(duì)耨個(gè)操作函數(shù)運(yùn)行期間拋出的異常做出反應(yīng),class應(yīng)該提供一個(gè)普通函數(shù)(而非在析構(gòu)函數(shù)中)執(zhí)行該操作;
條款09
決不在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用virtual函數(shù)
原因是這類調(diào)用從不會(huì)下降到derived class;
要確保構(gòu)造函數(shù)和析構(gòu)函數(shù)都沒(méi)有調(diào)用virtual函數(shù),而它們調(diào)用的所有函數(shù)也都服從同一約束;
條款10
令operator= 返回一個(gè)reference to *this
該條款同樣適用于operator+=等所有賦值相關(guān)運(yùn)算;
即寫(xiě)成
...
className& operator=(const className& rhs){
...
return *this;
}
...
條款11
在operator= 中處理"自我賦值"
"自我賦值"指的是對(duì)象賦值給自己時(shí);實(shí)現(xiàn)"異常安全性"可自然獲得"自我賦值安全性",所以可直接關(guān)注異常安全的處理;
達(dá)到"自我賦值安全性"的技術(shù)包括:比較雙方地址(認(rèn)同測(cè)試,這可能會(huì)有效率問(wèn)題), 精心周到的語(yǔ)句順序(先保持原有數(shù)據(jù)的指針,new操作異常時(shí)會(huì)保持原狀),copy-and-swap(兩種方式,1傳引用,制作副本,swap;2傳值,swap);
要確保任何函數(shù)如果操作一個(gè)以上的對(duì)象,而其中的多個(gè)對(duì)象是同一對(duì)象時(shí),其行為依然安全.
條款12
復(fù)制對(duì)象時(shí)勿忘其每一個(gè)成分
copying函數(shù)指的是copy構(gòu)造函數(shù)和copy assignment操作符;
Copying函數(shù)應(yīng)確保復(fù)制"對(duì)象內(nèi)的所有成員變量"和"所有base class 成分";
不要嘗試以某個(gè)copying 函數(shù)實(shí)現(xiàn)另一個(gè)copying函數(shù),應(yīng)將共同機(jī)能放進(jìn)某個(gè)函數(shù)中,并由兩個(gè)copying函數(shù)共同調(diào)用;