天天看點

重讀Effective C++

好久沒看C++的書了,用C++需要注意非常多的陷阱,寫起程式來确确實實是戴着鐐铐跳舞。可是,沒辦法,找工作還是得靠它。前幾天重讀了Effective C++,還是很喜歡侯捷的語言,在這裡把常用的注意事項記錄下來。

1. 使用相同形式的new和delete

2. 總是讓base class擁有virtual destructor(delete pBase調用哪個析構函數?)

3. 如果class内動态配置設定記憶體,請為此class聲明一個copy constructor和一個assignment運算符(記憶體配置設定問題)

4. initialization list中的members初始化次序應該和其在class内的聲明次序相同(class members按照聲明順序來初始化)

5. 令operation=傳回"*this 的 reference"

6. 在operation=中為所有的data members設定内容(主要是base class部分,拷貝構造函數也要注意這個問題)

7. 在operation=中檢查是否“自己指派給自己”(動态記憶體問題)

8. 盡可能使用const

9. 盡量使用pass-by-reference 少用 pass-by-value(減少構造函數和析構函數的調用)

10. 當你必須傳回object時,不要嘗試傳回reference( 空懸指針)

11. 明智地運用inlining(複雜函數、虛拟函數、構造函數、析構函數、對内聯函數取位址都會使内聯失敗,對老的編譯器會産生備援副本)

12. 通過public inheritance模塑出“isa”關系;通過layering技術模塑出has-a或is implemented in terms of關系;通過private 繼承實作is implemented in terms of關系,并可以調用父類的protected函數。優先使用layering技術。

13. 對于public繼承,純虛函數意味着接口繼承;虛函數意味着接口和預設實作繼承;非虛拟函數意味着接口和實作都被繼承,“不變形淩駕于變異性之上”

14. 絕對不要重新定義繼承而來的非虛拟函數(非虛拟函數是靜态綁定)

15. 絕對不要重新定義繼承而來的虛拟函數的預設函數值(預設函數值為靜态綁定)

16. 避免在繼承體系中做向下轉型動作(重新設計類的層次)

17. 清楚知道C++編譯器默默為我們完成和調用哪些函數(預設構造、拷貝構造、析構、指派操作符、取位址)

18. 使用non-local static object之前确定它已有初值(初始化次序無保證,用singleton模式解決 )