Item05:瞭解C++默默編寫並調用哪些函數
Konw what functions C++ silently writes and calls
編譯器可以暗自爲class創建default構造函數,copy構造函數,copy assignment操作符,移動構造函數,移動賦值運算符(C++11)。
Item06:明確拒絕自動生成的函數
Explicitly disallow the use of compiler-generated functions you do not want
- 可將相應的成員函數聲明爲private且不予實現。
- 通過在函數聲明後加=delete來阻止該函數調用。
Item07:爲多態基類聲明virtual析構函數
Declare destructors virtual in polymorphic base classes
- 避免詭異的對象(局部銷燬)而引發內存泄露,數據結構敗壞。
- 當成員全爲內置類型,且class不含virtual時,不必要令其析構函數爲virtual,因爲vptr也會佔用空間。
Item08:別讓異常逃離析構函數
Prevent exceptions from leaving destrucotrs
析構函數絕不要吐出異常。
- 如果析構函數拋出異常,則異常點之後的程序不會執行,如果析構函數在異常點之後執行了某些必要的動作比如釋放某些資源,則這些動作不會執行,會造成諸如資源泄漏,數據庫連接未關閉等問題。
- 通常異常發生時,c++的機制會調用已經構造對象的析構函數來釋放資源,此時若析構函數本身也拋出異常,則前一個異常尚未處理,又有新的異常,會造成程序崩潰的問題。
Item09:絕不要在構造或析構中調用virtual函數
Never call virtual functions during construction or destruction
在構造和析構期間不要調用virtual函數,因爲這類調用不下降至derived class(即無多態性)
Item10:令operator=返回一個reference to *this
Have assignment operation return a reference to *this
令賦值操作符返回一個引用。
Item11:在operator=處理自我賦值
Handle assignment to self in operator=
確保對象自我賦值時有良好的行爲(複製前別刪除)。
Item12:複製對象勿忘其每一個成分
Copy all parts of an object
- 複製所有的local成員變量
- 調用所有base classes內的適當copying函數
- 深淺複製控制好