C++ 編程規范

組織

  1. 不要拘泥于小節
  2. 在高警告級別干凈利落地進行編譯
  3. 使用自動構建系統
  4. 適用版本控制系統
  5. 在代碼審查上投入

設計

  1. 一個實體應該只有一個緊湊的職責
  2. 正確、簡單和清晰第一
  3. 編程中用該知道何時和如何考慮可伸縮性
  4. 不要進行不成熟的優化
  5. 不要進行不成熟的劣化
  6. 盡量減少全局和共享數據
  7. 隱藏信息
  8. 懂得何時和如何進行并發性編程
  9. 確保資源為對象所擁有。使用顯式的 RAII 和智能指針

編程

  1. 寧要編譯時和連接時的錯誤,也不要運行時錯誤
  2. 積極使用 const
  3. 避免使用宏
  4. 避免使用“魔數”
  5. 盡可能局部地聲明變量
  6. 總是初始化變量
  7. 避免函數過長,避免嵌套過深
  8. 避免跨編譯單元的初始化依賴
  9. 盡量減少定義性依賴。避免循環依賴
  10. 頭文件應該自給自足
  11. 總是編寫內部 #include 保護符,決不要編寫外部 #include 保護符

函數與操作符

  1. 正確地選擇通過值、(智能)指針或者引用傳遞參數
  2. 保持重載操作符的自然語義
  3. 優先使用算術操作符和賦值操作符的標準形式
  4. 優先使用 ++ 和 -- 的標準形式。優先調用前綴形式
  5. 考慮重載以避免隱含類型轉換
  6. 避免重載 &&、|| 或 ,(逗號)
  7. 不要編寫依賴于函數參數求值順序的代碼

類的設計與繼承

  1. 弄清所要編寫的是那種類
  2. 用小類代替巨類
  3. 用組合代替繼承
  4. 避免從并非要設計成基類的類中繼承
  5. 優先提供抽象接口
  6. 公用繼承即可替換性。繼承,不是為了重用,而是為了被重用
  7. 實施安全的改寫
  8. 考慮將虛擬函數聲明為非公用的,將公用函數聲明為非虛擬的
  9. 要避免提供隱式轉換
  10. 將數據成員設為私有的,無行為的聚集(C 語言形式的 struct)除外
  11. 不要公開內部數據
  12. 明智地使用 Pimpl
  13. 優先編寫非成員非友元函數
  14. 總是一起提供 new 和 delete
  15. 如果提供類專門的 new,應該提供所有標準形式(普通、就地和不拋出)

構造、析構與復制

  1. 以同樣的順序定義和初始化成員變量
  2. 在構造函數中用初始化代替賦值
  3. 避免在構造函數和析構函數中調用虛擬函數
  4. 將基類析構函數設為公用且虛擬的,或者保護且非虛擬的
  5. 析構函數、釋放和交換絕對不能失敗
  6. 一致地進行復制和銷毀
  7. 顯式地啟用或者禁止復制
  8. 避免切片。在基類中考慮用克隆代替復制
  9. 使用賦值的標準形式
  10. 只要可行,就提供不會失敗的 swap (而且要正確地提供)

名字空間與模塊

  1. 將類型及其非成員函數接口置于同一名字空間中
  2. 應該將類型和函數分別置于不同的名字空間中,除非有意想讓它們一起工作
  3. 不要在頭文件中或者 #include 之前編寫名字空間 using
  4. 要避免在不同的模塊中分配和釋放內存
  5. 不要在頭文件中定義具有鏈接的實體
  6. 不要允許異??缭侥K邊界傳播
  7. 在模塊的接口中使用具有良好可移植性的類型

模板與泛型

  1. 理智地結合靜態多態性和動態多態性
  2. 有意地進行顯式自定義
  3. 不要特化函數模板
  4. 不要無意地編寫不通用的代碼

錯誤處理與異常

  1. 廣泛地使用斷言記錄內部假設和不變式
  2. 建立合理的錯誤處理策略,并嚴格遵守
  3. 區別錯誤與非錯誤
  4. 設計和編寫錯誤安全代碼
  5. 優先使用異常報告錯誤
  6. 通過值拋出,通過引用捕獲
  7. 正確地報告、處理和轉換錯誤
  8. 避免使用異常規范

STL: 容器

  1. 默認情況下使用 vector。否則選擇其它合適的容器。
  2. 用 vector 和 string 取代數組。
  3. 使用 vector(以及 string::c_str)來和非 C++ API 交換數據。
  4. 僅在容器中存儲值和智能指針。
  5. 與其它方法相比,要盡量使用 push_back 來擴大容器。
  6. 與單元素操作相比,要盡量使用區間操作。
  7. 使用公認的慣用法來真正地縮小容量以及真正地刪除元素。

STL算法(STL: Algorithms)

  1. 使用一個帶檢查的(checked)STL 實現。
  2. 與手工編寫的循環相比,要盡量調用 STL 算法。
  3. 使用正確的 STL 查找算法。
  4. 使用正確的 STL 排序算法。
  5. 使 predicate 成為純函數(pure function)。
  6. 在用作算法和比較器(comparer)時,要優先用函數對象來代替函數。
  7. 正確地編寫函數對象(Function Object)。

類型安全性(Type Safety)

  1. 避免類型選擇(type switching);盡量使用多態。
  2. 依賴于對象類型,而不要依賴于對象的表示方法。
  3. 避免使用 reinterpret_cast。
  4. 避免用 static_cast 來強制轉換指針類型。
  5. 避免強制去除 const。
  6. 不要用 C 風格的強制類型轉換。
  7. 不要對非 POD 類型使用 memcpy 或 memcmp。
  8. 不要用 union 來重新解釋數據。
  9. 不要使用 varargs(省略號)。
  10. 不要使用無效的對象。不要使用不安全的函數。
  11. 不要以多態方式處理數組。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容

  • 引言 一直以來都是在談如何開發, 如開發的小技巧小經驗 今天為什么突然說起編程規范來了呢? 因為在我看來, 編程規...
    諾之林閱讀 562評論 1 5
  • 命名規范 1.【強制】 代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。 反例: _nam...
    666真666閱讀 787評論 2 4
  • 方法聲明和定義 -或者+和返回類型之間須使用一個空格,括號要同行并有一個空格 方法應該像這樣: 如果函數名字太長,...
    Dayon閱讀 242評論 0 1
  • 本文記錄一下Objective-C編程規范以及一些建議,可能后續會有些修改和補充,至于初衷是最近接手的項目中代碼"...
    SuperMario_Nil閱讀 1,819評論 2 13
  • 標簽: C# 編程規范 命名規約 【強制】代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。...
    哈希君閱讀 3,993評論 0 4