【讀書筆記】EffectiveC++ 2.構(gòu)造/析構(gòu)/賦值運(yùn)算
規(guī)則5?了解c++默默編寫并調(diào)用哪些函數(shù)
在什么都不聲明的情況下。編譯器可以為class自動(dòng)創(chuàng)建default構(gòu)造函數(shù),而一旦你自己編寫了構(gòu)造函數(shù),它將不會(huì)生成。如果你希望你的class作為基類存在或需要被某些容器裝載,你需要手動(dòng)增加一行 =default的構(gòu)造函數(shù)。
如果不聲明,編譯器會(huì)自動(dòng)提供copy構(gòu)造函數(shù)和copy assignment操作符,但只能完成相對(duì)簡(jiǎn)單的賦值操作。
規(guī)則6 若不想使用編譯器自動(dòng)生成的函數(shù),就該明確拒絕
接上文,編譯器默認(rèn)自動(dòng)提供copy構(gòu)造函數(shù)和copy assignment操作符,并將其聲明為public。如果你不希望這樣做,你可以手動(dòng)提供一份private的copy構(gòu)造函數(shù)和copy assignment操作符,這已經(jīng)可以避免絕大多數(shù)情況下對(duì)于構(gòu)造的錯(cuò)誤調(diào)用。但如果你希望成員函數(shù)和友員函數(shù)、也不這么做,就需要?jiǎng)?chuàng)建一個(gè)專門的基類來做上面的行為,然后讓你的類繼承它。
規(guī)則7?為多態(tài)基類聲明virtual析構(gòu)函數(shù)
假如多態(tài)基類沒有virtual析構(gòu)函數(shù),那么當(dāng)你使用基類指針指向派生對(duì)象,并試圖使用這個(gè)指針刪除該對(duì)象時(shí),派生類的析構(gòu)函數(shù)將不會(huì)被調(diào)用。
規(guī)則8?別讓異常逃離析構(gòu)函數(shù)
析構(gòu)函數(shù)中拋出異常會(huì)導(dǎo)致剩下的資源的沒有被正確釋放
規(guī)則9?絕不在構(gòu)造和析構(gòu)過程中調(diào)用virtual函數(shù)
因?yàn)榇藭r(shí)調(diào)用的是基類的該virtual函數(shù),而非你想要使用的派生類中的函數(shù)。
規(guī)則10?令operator=返回一個(gè)reference to *this?
使用return *this 這是一個(gè)協(xié)議
規(guī)則11 在operator=中處理自我賦值
可以使用證同測(cè)試(this==&input)?
總之需要保證可能需要同時(shí)操作兩個(gè)相同對(duì)象的函數(shù)不出現(xiàn)問題
規(guī)則12?復(fù)制對(duì)象時(shí)勿忘其每一個(gè)成分
如果自己重新書寫copy構(gòu)造函數(shù),那么記得確認(rèn)是否真的復(fù)制了對(duì)象中的每個(gè)成員,因?yàn)榫幾g器不會(huì)對(duì)其做任何檢測(cè)。