一:頭檔案 作用域
使用前置聲明,減少.h檔案的#include數量,減少編譯依賴
函數輸入參數在前(const references),輸出參數在後(non-const pointer)
include順序:c,c++,其他庫,本項目庫
函數,類内部使用 using ::foo::bar 或 namespace fez = ::foo::bar::baz
減少不必要的構造函數和析構函數調用(定義初始化,變量位置,++前置)
二:類
對單參數構造函數使用 C++關鍵字 explicit,避免不期望的隐式類型轉換
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
用做base class的destruct聲明為virtual
使用防函數而不是操作符重載
編寫短小的函數(40行)!!
僅在輸入參數類型不同、功能相同時使用重載函數
将友元定義在同一檔案下
使用static_cast<>,lexical_cast<>,除測試不使用dynamic_cast<>
使用斷言聲明變量為非負數,不要使用無符号型。
三:命名
類型和變量:名詞 函數:指令性
類型名:大寫開頭不含下劃線 UrlTable
成員函數:駝峰型
變量:小寫下劃線分割,成員變量下劃線開始!!
宏和枚舉:全大寫加下劃線!!
四:注釋
檔案注釋:公告 作者資訊 檔案内容
類注釋:類功能 用法
函數注釋:
1) inputs(輸入)及 outputs(輸出);
2) 對類成員函數而言:函數調用期間對象是否需要保持引用參數,是否會釋放這些參數; 3) 如果函數配置設定了空間,需要由調用者釋放;
4) 參數是否可以為 NULL;
5) 是否存在函數使用的性能隐憂(performance implications);
6) 如果函數是可重入的(re-entrant),其同步前提(synchronization assumptions) 是什麼?
實作注釋:對于實作代碼中巧妙的、晦澀的、有趣的、重要的地方加以注釋。
TODO注釋:// TODO([email protected]): Use a "*" here for concatenation operator.
五:空格和縮進
class MyClass : public OtherClass {
public: // Note the 1 space indent!
MyClass(); // Regular 2 space indent.
explicit MyClass(int var);
~MyClass() {}
void SomeFunction();
void SomeFunctionThatDoesNothing() {
}
void set_some_var(int var) { some_var_ = var; }
int some_var() const { return some_var_; }
private:
bool SomeInternalFunction();
int some_var_;
int some_other_var_;
DISALLOW_COPY_AND_ASSIGN(MyClass);
};