C++編程規范(101條規則、準則與最佳實踐)
雖然是書本的目錄,但也是高度的概括和總結。
組織和策略問題
第0條:不要拘泥于小節(了解哪些東西不應該標準化)
第1 條:在高警告級別干凈利落地進行編譯
第2 條:使用自動構建系統
第3 條:使用版本控件器
第4 條:做代碼審查
設計風格
第5 條:一個實體應該只有一個緊湊的職責
第6 條:正確、簡單和清晰第一
第7 條:編程中應該知道何時和如何考慮可伸縮性
第8 條:不要進行不成熟的優化
第9 條:不要進行不成熟的劣化
第10條:盡量減少全局和共享數據
第11條:隱藏信息
第12條:懂得何時和如何進行并發性編程
第13條:確保資源為對象所擁有。使用顯式的RAII和智能指針
編程風格
第14條:寧要編譯時和連接時錯誤,也不要運行時錯誤
第15條:積極使用const
第16條:避免使用宏
第17條:避免使用“魔數”
第18條:盡可能局部地聲明變量
第19條:總是初始化變量
第20條:避免函數過長,避免嵌套過深
第21條:避免跨編譯單元的初始化依賴
第22條:盡量減少定義性依賴。避免循環依賴
第23條:頭文件應該自給自足
第24條:總是編寫#include保護符,決不要編寫外部#include保護符
函數與操作符
第25條:正確地選擇通過值、(智能)指針或者引用傳遞參數
第26條:保持重載操作符的自然語義
第27條:優先使用算術操作符和賦值操作符的標準形式
第28條:優先使用++和—的標準形式。優先調用前綴形式
第29條:考慮重載以避免隱含類型轉換
第30條:避免重載&&、||或,(逗號)(重載后失去短路求值和結合性)
第31條:不要編寫依賴于函數參數求求值順序的代碼
類的設計與繼承
第32條:弄清所要編寫的是哪種類
第33條:用小類代替巨類
第34條:用組合代替繼承
第35條:避免從并非要設計成基類的類中繼承
第36條:優先提供抽象接口
第37條:公用繼承即可替代性。繼承不是為了重用,而是為了被重用
第38條:實施安全的覆蓋
第39條:考慮將虛擬函數聲明為非公用的,將公用函數聲明為非虛擬的
第40條:要避免提供隱式轉換
第41條:將數據成員設為私有的,無行為的聚集(C語言形式的struct)除外
第42條:不要公開內部數據
第43條:明智地使用Pimpl
第44條:優先編寫非成員非友無函數
第45條:總是一起提供new和delete
第46條:如果提供類專門的new,應該提供所有標準形式
析構和構造
第47條:以同樣的順序定義和初始化成員變量
第48條:在構造函數中用初始化式代替賦值
第49條:避免在構造函數和析構函數中調用虛擬函數
第50條:將基類析構函數設為公用且虛擬的,或者保護且非虛擬的
第51條:析構函數、釋放和交換絕對不能失敗
第52條:一致地進行復制和銷毀
第53條:顯式地啟用或者禁止復制
第54條:避免切片。在基類中考慮用克隆代替復制
第55條:使用賦值的標準形式
第56條:中要可行,就提供不會失敗的swap(而且要正確地提供)
名字空間與模塊
第57條:將類型及其非成員函數接口置于同一名字空間中
第58條:應該將類型和函數分別置于不同的名字空間中,除非有意想讓它們一起工作
第59條:不要在頭文件中或者#include之前編寫名字空間using
第60條:要避免在不同的模塊中分配和釋放內存
第61條:不要在頭文件中定義具有鏈接的實體
第62條:不要允許異常跨越模塊邊界傳播
第63條:在模塊的接口中使用具有良好可移植性的類型
模塊與泛型
第64條:理智地結合靜態多態性和動態多態性
第65條:有意地進行顯式自定義
第66條:不要特化函數模板
第67條:不要無意地編寫不通用的代碼
錯誤處理與異常
第68條:廣泛地使用斷言記錄內部假設和不變式
第69條:建立合理的錯誤處理策略,并嚴格遵守
第70條:區別錯誤與非錯誤
第71條:設計和編寫錯誤安全代碼
第72條:優先使用異常報告錯誤
第73條:通過值拋出,通過引用捕獲
第74條:正確地報告、處理和轉換錯誤
第75條:避免使用異常規范
STL:容器
第76條:默認時使用vector。否則,選擇其他合適的容器
第77條:用vector和string代替數組
第78條:使用vector(和string::c_str)與非C++API交換數據
第79條:在容器中只儲存值和智能指針
第80條:用push_back代替其他擴展序列的方法
第81條:多用范圍操作,少用單元素操作
第82條:使用公認的慣用法真正地壓縮容量,真正地刪除元素
STL:算法
第83條:使用帶檢查的STL實現
第84條:用算法調用代替手工編寫的循環
第85條:使用正確的STL查找算法
第86條:使用正確的STL排序算法
第87條:使謂詞成為純函數
第88條:算法和比較器的參數應多用函數對象少用函數
第89條:正確編寫函數對象
類型安全:
第90條:避免使用類型分支,多使用多態
第91條:依賴類型,而非其表示方式
第92條:避免使用reinterpret_cast
第93條:避免對指針使用static_cast
第94條:避免強制轉換const
第95條:不要使用C風格的強制轉換
第96條:不要對非POD進行memcpy操作或者mencmp操作
第97條:不要使用聯合重新解釋表達式
第98條:不要使用可變長參數(…)
第99條:不要使用失效對象(注意迭代器失效,特別是在插入元素后)。不要使用不安全函數
第100條:不要多態地處理數組