國慶回家把這本書重新翻了一遍,強烈建議每個C++程序員都去看看這本書.
組織和策略問題
- 0. 不拘小節(jié)(或:了解什么不需要被規(guī)范化)。
- 1. 在高警告級別下干凈地編譯。
- 2. 使用自動化的構建(build)系統(tǒng)
- 3. 使用版本控制系統(tǒng)(version control system)。
- 4. 在代碼復查上投資。
設計風格(Design Style)
- 5. 給每一個實體分配一份內(nèi)聚的職責。
- 6. 以正確,簡單,清晰為上。
- 7. 了解何時及如何為可伸縮性編寫代碼。
- 8. 不要過早地優(yōu)化。
- 9. 不要過早地退而求次。
- 10. 將全局和共享的數(shù)據(jù)減至最少。
- 11. 隱藏信息。
- 12. 了解何時及如何為并發(fā)性編寫代碼。
- 13. 確保資源為對象所占有。使用顯式的RAII和智能指針。
編程風格(Coding Style)
- 14. 寧可在編譯和鏈接時出錯也不要在運行時出錯。
- 15. 主動使用const。
- 16. 避免使用宏。
- 17. 避免使用魔數(shù)(magic numbers)。
- 18. 盡可能局部地聲明變量。
- 19. 始終初始化變量。
- 20. 避免太長的函數(shù)。避免太深的嵌套。
- 21. 避免不同的編譯單元在初始化過程中的依賴關系。
- 22. 將定義時的依賴性降至最低。避免循環(huán)依賴性。
- 23. 保證頭文件的自足性(Make header files self-sufficient)。
- 24. 始終用內(nèi)部#include防護哨。絕對不要用外部#include防護哨。
函數(shù)與操作符(Functions and Operators)
- 25. 通過值,(智能)指針,或引用適當?shù)厝〉脜?shù)。
- 26. 在重載操作符時,要保留被重載操作符的自然語義。
- 27. 最好是保持算術和賦值運算符的標準形式。
- 28. 最好是保持標準形式的++和--。最好是調(diào)用前綴的形式。
- 29. 考慮通過重載來避免隱式的類型轉(zhuǎn)換。
- 30. 避免重載&&, ||, 或, (逗號)。
- 31. 不要編寫對函數(shù)參數(shù)的求值順序有依賴性的代碼。
類設計及繼承(Class Design and Inheritance)
- 32. 清楚自己要編寫什么類型的類。
- 33. 最好是設計最小型的類而不要設計巨型類。
- 34. 優(yōu)先采用聚合,其次才是繼承。
- 35. 避免繼承自未設計為基類的類。
- 36. 最好是提供抽象接口。
- 37. 公有繼承代表可替換性。繼承,不是為了重用,而是為了被重用。
- 38. 安全地覆蓋虛函數(shù)。
- 39. 考慮使虛函數(shù)成為非公有函數(shù),使公有函數(shù)成為非虛函數(shù)。
- 40. 避免提供隱式轉(zhuǎn)換。
- 41. 使類的數(shù)據(jù)成員為私有,除非是無行為的聚合類(C風格的結構)。
- 42. 不要泄露你的內(nèi)部實現(xiàn)。
- 43. 明智地使用Pimpl慣用法。
- 44. 最好是編寫非成員非友元函數(shù)。
- 45. 始終同時提供new和delete。
- 46. 如果你提供類特有的new,那么要提供所有的標準形式(plain,in-place,及nothrow)。
構造,析構,及復制操作(Construction, Destruction, and Copying)
- 47. 以相同的順序定義及初始化成員變量。
- 48. 在構造函數(shù)中最好是用初始化列表而避免用賦值操作符。
- 49. 避免在構造函數(shù)和析構函數(shù)中調(diào)用虛函數(shù)。
- 50. 使基類的析構函數(shù)成為公有的虛函數(shù),或受保護的非虛函數(shù)。
- 51. 析構函數(shù),資源釋放函數(shù),以及swap絕不會失敗。
- 52. 以一致的方式進行復制和銷毀。
- 53. 顯式地允許或禁止復制。
- 54. 避免分割對象。考慮用Clone來取代在基類中進行復制。
- 55. 最好是保持賦值操作符的標準形式。
- 56. 只要合理,就(正確地)提供不會失敗的swap。
名字空間與模塊(Namespaces and Modules)
- 57. 把類型和它的非成員函數(shù)接口放在同一個名字空間中。
- 58. 除非有意讓類型和函數(shù)協(xié)作,否則把它們放在單獨的名字空間中。
- 59. 不要在頭文件中或#include語句之前寫名字空間層級的using。
- 60. 避免在不同的模塊中分配和釋放內(nèi)存。
- 61. 不要在頭文件中定義具有鏈接屬性的實體(entities with linkage)。
- 62. 不要讓異常在傳遞時跨越模塊的邊界。
- 63. 在模塊的接口中使用可移植的類型。
模板與泛型(Templates and Genericity)
- 64. 明智地結合靜態(tài)多態(tài)性和動態(tài)多態(tài)性。
- 65. 有意地并顯式地定制。
- 66. 不要特化函數(shù)模板。
- 67. 不要在無意中編寫不通用的代碼。
錯誤處理與異常(Error Handling and Exceptions)
- 68. 大量使用斷言來說明內(nèi)部的假設和不變性。
- 69. 設立一套合理的錯誤處理策略,并嚴格遵循。
- 70. 區(qū)分錯誤與非錯誤。
- 71. 設計并編寫能夠安全地處理錯誤的代碼。
- 72. 盡量用異常來報告錯誤。
- 73. 拋出值,捕獲引用。
- 74. 適當?shù)貓蟾妫幚聿⑥D(zhuǎn)換錯誤。
- 75. 避免異常規(guī)格(exception specifications)。
STL容器(STL: Containers)
- 76. 默認情況下使用vector。否則選擇其它合適的容器。
- 77. 用vector和string取代數(shù)組。
- 78. 使用vector(以及string::c_str)來和非C++ API交換數(shù)據(jù)。
- 79. 僅在容器中存儲值和智能指針。
- 80. 與其它方法相比,要盡量使用push_back來擴大容器。
- 81. 與單元素操作相比,要盡量使用區(qū)間操作。
- 82. 使用公認的慣用法來真正地縮小容量以及真正地刪除元素。
STL算法(STL: Algorithms)
- 83. 使用一個帶檢查的(checked)STL實現(xiàn)。
- 84. 與手工編寫的循環(huán)相比,要盡量調(diào)用STL算法。
- 85. 使用正確的STL查找算法。
- 86. 使用正確的STL排序算法。
- 87. 使predicate成為純函數(shù)(pure function)。
- 88. 在用作算法和比較器(comparer)時,要優(yōu)先用函數(shù)對象來代替函數(shù)。
- 89. 正確地編寫函數(shù)對象(Function Object)。
類型安全性(Type Safety)
- 90. 避免類型選擇(type switching);盡量使用多態(tài)。
- 91. 依賴于對象類型,而不要依賴于對象的表示方法。
- 92. 避免使用reinterpret_cast。
- 93. 避免用static_cast來強制轉(zhuǎn)換指針類型。
- 94. 避免強制去除const。
- 95. 不要用C風格的強制類型轉(zhuǎn)換。
- 96. 不要對非POD類型使用memcpy或memcmp。
- 97. 不要用union來重新解釋數(shù)據(jù)。
- 98. 不要使用varargs(省略號)。
- 99. 不要使用無效的對象。不要使用不安全的函數(shù)。
- 100. 不要以多態(tài)方式處理數(shù)組。