條款6
編譯器會爲類自動創建default構造函數、copy構造函數、copy assignment操作符。若不想要這些功能,以免被其他類調用,可以將相應的類函數聲明爲private並不予實現。也可以單獨做一個Uncopyable類,此類設置某些函數爲private類型,作爲基類使用。
條款7
帶多態性質的基類應該聲明一個虛析構函數。如果一個類帶有任何虛函數,它就應該擁有一個虛析構函數。
類的設計目的如果不是爲了作爲具有多臺性質的基類,那麼這個類最好不要聲明虛析構函數,否則會帶來不必要的開銷。
條款8
析構函數絕對不要拋出異常,如果一個被析構函數調用的函數可能拋出異常,析構函數應該捕獲任何異常,然後吞下他們或結束程序。
如果客戶需要對某個操作函數運行期間跑車的異常做出反應,那麼累應該提供一個在析構函數之外的函數執行該操作。
條款9
在構造函數和析構函數期間不要調用virtual函數,因爲這類迪歐用從不下降至派類。
條款10
爲了賦值的傳遞性存在,令operator =返回一個指向自身的指針即*this。
條款11
爲了避免自我賦值出現異常,可以採用兩種方法。一:證同測試,如果等號左右相同就不執行賦值。二:copy and swap,即做一個副本然後用swap做交換。
條款12
coping函數應該確保賦值對象內的所有成員變量和所有base class的成分。因此,在字定義的cipying 函數中不僅要賦值自身的成員,還要主動調用父類的copying函數。
條款13
爲了方式資源泄露,請使用RAII對象,他們在構造函數中獲得資源並在析構函數中釋放資源。
兩個被常用的RAII類分別是tr1::shared_ptr和auto_ptr。請注意兩者的區別。後者不允許有兩個對象擁有統一資源。
注:
tr1::shared_ptr採用“引用計數智能指針”-RCSP(Reference-counting Smart Pointer)
RAII(Resource Acquisition Is Initialization)即,“資源取得時機便是初始化時機”。
在動態分配而得到的Array上使用auto_ptr或tr1::shared_ptr是不行的,因爲兩者在其析構函數內做的事delete而不是delete[]動作。