Effective C++_讀書(shū)筆記_102

構(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)用;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容