C++編程規范(101條規則、準則與最佳實踐)

jopen 12年前發布 | 17K 次閱讀 C/C++開發 C/C++

雖然是書本的目錄,但也是高度的概括和總結。 

組織和策略問題

第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條:不要多態地處理數組

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!