組織
- 不要拘泥于小節
- 在高警告級別干凈利落地進行編譯
- 使用自動構建系統
- 適用版本控制系統
- 在代碼審查上投入
設計
- 一個實體應該只有一個緊湊的職責
- 正確、簡單和清晰第一
- 編程中用該知道何時和如何考慮可伸縮性
- 不要進行不成熟的優化
- 不要進行不成熟的劣化
- 盡量減少全局和共享數據
- 隱藏信息
- 懂得何時和如何進行并發性編程
- 確保資源為對象所擁有。使用顯式的 RAII 和智能指針
編程
- 寧要編譯時和連接時的錯誤,也不要運行時錯誤
- 積極使用 const
- 避免使用宏
- 避免使用“魔數”
- 盡可能局部地聲明變量
- 總是初始化變量
- 避免函數過長,避免嵌套過深
- 避免跨編譯單元的初始化依賴
- 盡量減少定義性依賴。避免循環依賴
- 頭文件應該自給自足
- 總是編寫內部 #include 保護符,決不要編寫外部 #include 保護符
函數與操作符
- 正確地選擇通過值、(智能)指針或者引用傳遞參數
- 保持重載操作符的自然語義
- 優先使用算術操作符和賦值操作符的標準形式
- 優先使用 ++ 和 -- 的標準形式。優先調用前綴形式
- 考慮重載以避免隱含類型轉換
- 避免重載 &&、|| 或 ,(逗號)
- 不要編寫依賴于函數參數求值順序的代碼
類的設計與繼承
- 弄清所要編寫的是那種類
- 用小類代替巨類
- 用組合代替繼承
- 避免從并非要設計成基類的類中繼承
- 優先提供抽象接口
- 公用繼承即可替換性。繼承,不是為了重用,而是為了被重用
- 實施安全的改寫
- 考慮將虛擬函數聲明為非公用的,將公用函數聲明為非虛擬的
- 要避免提供隱式轉換
- 將數據成員設為私有的,無行為的聚集(C 語言形式的 struct)除外
- 不要公開內部數據
- 明智地使用 Pimpl
- 優先編寫非成員非友元函數
- 總是一起提供 new 和 delete
- 如果提供類專門的 new,應該提供所有標準形式(普通、就地和不拋出)
構造、析構與復制
- 以同樣的順序定義和初始化成員變量
- 在構造函數中用初始化代替賦值
- 避免在構造函數和析構函數中調用虛擬函數
- 將基類析構函數設為公用且虛擬的,或者保護且非虛擬的
- 析構函數、釋放和交換絕對不能失敗
- 一致地進行復制和銷毀
- 顯式地啟用或者禁止復制
- 避免切片。在基類中考慮用克隆代替復制
- 使用賦值的標準形式
- 只要可行,就提供不會失敗的 swap (而且要正確地提供)
名字空間與模塊
- 將類型及其非成員函數接口置于同一名字空間中
- 應該將類型和函數分別置于不同的名字空間中,除非有意想讓它們一起工作
- 不要在頭文件中或者 #include 之前編寫名字空間 using
- 要避免在不同的模塊中分配和釋放內存
- 不要在頭文件中定義具有鏈接的實體
- 不要允許異??缭侥K邊界傳播
- 在模塊的接口中使用具有良好可移植性的類型
模板與泛型
- 理智地結合靜態多態性和動態多態性
- 有意地進行顯式自定義
- 不要特化函數模板
- 不要無意地編寫不通用的代碼
錯誤處理與異常
- 廣泛地使用斷言記錄內部假設和不變式
- 建立合理的錯誤處理策略,并嚴格遵守
- 區別錯誤與非錯誤
- 設計和編寫錯誤安全代碼
- 優先使用異常報告錯誤
- 通過值拋出,通過引用捕獲
- 正確地報告、處理和轉換錯誤
- 避免使用異常規范
STL: 容器
- 默認情況下使用 vector。否則選擇其它合適的容器。
- 用 vector 和 string 取代數組。
- 使用 vector(以及 string::c_str)來和非 C++ API 交換數據。
- 僅在容器中存儲值和智能指針。
- 與其它方法相比,要盡量使用 push_back 來擴大容器。
- 與單元素操作相比,要盡量使用區間操作。
- 使用公認的慣用法來真正地縮小容量以及真正地刪除元素。
STL算法(STL: Algorithms)
- 使用一個帶檢查的(checked)STL 實現。
- 與手工編寫的循環相比,要盡量調用 STL 算法。
- 使用正確的 STL 查找算法。
- 使用正確的 STL 排序算法。
- 使 predicate 成為純函數(pure function)。
- 在用作算法和比較器(comparer)時,要優先用函數對象來代替函數。
- 正確地編寫函數對象(Function Object)。
類型安全性(Type Safety)
- 避免類型選擇(type switching);盡量使用多態。
- 依賴于對象類型,而不要依賴于對象的表示方法。
- 避免使用 reinterpret_cast。
- 避免用 static_cast 來強制轉換指針類型。
- 避免強制去除 const。
- 不要用 C 風格的強制類型轉換。
- 不要對非 POD 類型使用 memcpy 或 memcmp。
- 不要用 union 來重新解釋數據。
- 不要使用 varargs(省略號)。
- 不要使用無效的對象。不要使用不安全的函數。
- 不要以多態方式處理數組。