標頭檔
1、 define保護
標頭檔的命名應基於其所在項目原始碼樹的全路徑。
2、 標頭檔依賴
使用前置聲明(forward declaration),盡量減少.h檔案中#include的數量。
能依賴聲明的就不依賴定義。
3、 內嵌函式
只有當函數少於10行或更少時,才使用內聯類型。
4、 -inl.h
複雜內嵌函式的定義,應放在-inl.h檔案中。
5、 函數定義順序
輸入參數在前,輸出參數在後。
6、 檔案包含順序
C庫\C++庫\其它庫的.h\項目內的.h
命名空間
1、 命名空間
在.cc檔案中推薦使用不具名的命名空間(unnamednamespaces).
不能在.h檔案中使用不具名的命名空間。
2、 嵌套類(Nested class)
當公開嵌套類作為介面的一部分時,最好將嵌套類的聲明置於命名空間之中。
3、 非成員函數(Nonmember)、靜態成員函數(StaticMember)和全域函數(Global Functions)
使用命名空間中的非成員函數或靜態成員函數,盡量不要使用全域函數。
4、 局部變數
將函數變數儘可能置於最小的範圍內,在聲明變數時將其初始化。
5、 全域變數
class類型的區安監局變數是被禁止的,內建類型的全域變數是允許的,當然多線程代碼中非常熟全域變數也是被禁止的。永遠不要使用函數傳回值初始化全域變數。
C++類
1、 建構函式的職責
建構函式中只進行那些沒有實際意義的初始化,可能的話,使用Init()方法集中初始化為有意義的(non-trivial)資料。
2、 預設建構函式
如果類中定義了成員變數,沒有提供其他建構函式,你需要定義一個預設建構函式。預設建構函式更適合於初始化對象,使對象內部狀態(internal state)一致、有效。
3、 明確的建構函式
對但參數建構函式使用C++關鍵字explicit。
4、 拷貝建構函式
盡在代碼中需要拷貝一個類對象的時候使用拷貝建構函式;不需要拷貝時應使用:DISALLOW_COPY_AND_ASSIGN
5、 結構體和類
僅當只有資料時使用struct,其它一概使用class。
6、 繼承
使用組合通常比使用繼承更適宜,如果使用繼承的話,只使用公用繼承。
7、 多重繼承
真正需要用多重實現繼承的時候非常少,只有當最多一個基類中含有實現,其他幾類都是以Interface為尾碼的純介面類時才會使用多重繼承。
8、 操作符重載
出少數特定環境外,不要重載操作符。
9、 存取控制
將資料成員私人化,並提供相關存取函數。
10、 聲明次序
public在private之前,成員函數在資料成員前。
11、 編寫短小的函數
智能指標和其他C++特性
1、 智能指標
如果確實需要使用智能指標的話,scoped_ptr完全可以勝任。在非常特殊的情況下,你應該只使用shared_ptr,任何情況下都不要使用auto_ptr。
2、 引用參數
按引用傳遞的參數必須加上const。
3、 函數重載
盡在輸入類型不同、功能相同時使用重載函數(喊建構函式),不要使用函數重載模仿預設函數參數。
4、 預設參數
禁止使用預設函數參數。
5、 變長數組和alloca
禁止使用變長數組和alloca,使用安全地分配器allocator。
6、 友元
允許合理使用友元類及友元函數。
7、 異常
不要使用C++異常。
8、 運行時類型識別(Run-Time Type Information, RTTI)
禁止使用RTTI.
9、 類型轉換
使用static_cast<>()等C++的類型轉化,不要使用int y = (int)x 或 int y = int(x);
10、 流(Stream)
只在記錄日誌時使用流。
11、 前置自增和自減(Preincrement and Predecrement)
對於迭代器和其他模板對象使用首碼形式(++i)的自增、自增運算子。
12、 const的使用
強烈建議你在任何可以使用的情況下都要使用const。
13、 整型
14、 64位下的可移植性
15、 預先處理宏
使用宏時要謹慎,盡量以內嵌函式、枚舉和常量代替之。
16、 0和NULL
整數用0,實數用0.0,指標用NULL,字元(串)用’\0’.
17、 sizeof (sizeof)
儘可能用sizeof(varname)代替sizeof(type).
18、 Boost庫
只是用boost中被認可的庫。
命名規範
1、 通用命名規則
函數命名、變數命名、檔案命名應具有描述性,不要過度縮寫,類型和變數應該是名詞,函數名可以用“命令性”動詞。
2、 檔案命名:
檔案名稱要全部小寫,可以包含底線(_)或短線(-)。
3、 類型命名
類型命名每個單詞以大寫 開頭。
4、 變數命名
變數名一律小寫,單詞間以底線相連,類的成員變數以底線結尾。
5、 常量命名
在名稱前加k。
6、 函數命名
普通函數大小寫混合,存取函數要求與變數名匹配。
7、 命名空間
命名空進的名稱是全小寫,其命名基於項目名稱和目錄結構。
8、 枚舉命名
枚舉值應全部大寫,單詞間以底線相連。
9、 宏命名
10、 命名規則例外
代碼注釋
1、 注釋風格(Comment Style)
風格要統一。
2、 檔案注釋(File Comment)
著作權、許可版本、作者、內容
3、 類注釋
每個類的定義要附著描述類的功能和用法的注釋。
4、 TODO注釋
對那些臨時的、短期的解決方案,或已經夠好但並不完美的代碼使用TODO注釋。
格式
1、 行長度
每一行代碼字元數不超過80.
2、 空格還是製表位
只是用空格,每次縮排2個空格。