類別是 C++ 基本代碼單元。本節規範建構/解構/複製/繼承/多態/封裝等核心機制的最佳實踐。
Init()main() 可能違反依賴假設。Init() 方法並以成員旗標標記初始化狀態。explicitFoo(string) 會讓 func(Foo) 接受 string 參數自動轉換。explicit。例外:複製建構函數、刻意設計為透明包裝器的類別(註解說明)。private 區宣告未定義的複製建構/賦值函式,或用巨集:#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
class Foo {
public: Foo(int f); ~Foo();
private: DISALLOW_COPY_AND_ASSIGN(Foo);
};
struct,其他用 classstruct:僅含資料成員、相關常數,**無行為函式**(建構/解構/初始化/驗證等除外)。直接存取成員。class:含行為函式、不變條件、封裝邏輯。struct。struct 無底線結尾)。public;"is-a" 關係才繼承,"has-a" 用組合;有虛擬函式類別**必須**有虛擬解構函式;衍生類覆寫虛擬函式**明確加 virtual**;僅衍生類存取的成員設 protected,**資料成員永遠 private**。Interface 為後綴)時允許。Interface 為後綴(非強制)protected 無參數)、基類亦為純介面。operator& 妨礙前置宣告。Equals()/CopyFrom()。operator<<(ostream&, const T&) 等標準慣用法,**須文件說明理由**;STL 容器 Key 比較用仿函式型別而非多載 operator==/operator<。private,提供存取函式foo_ + foo()/set_foo(),存取函式通常內聯於標頭檔。
DISALLOW_COPY_AND_ASSIGN 置於 private 區塊末尾。實作檔函式順序對應宣告順序。大型函式勿內聯於類別定義。
長函式修改風險高,拆分利於閱讀、測試、複用。重構既有長函式無需恐懼。