天天看點

google c++程式設計規範(重點記錄)

一:頭檔案 作用域

使用前置聲明,減少.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);
};