首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Google C++ 風格指南(三):類別設計規範

     編輯:關於C++

類別設計核心原則

類別是 C++ 基本代碼單元。本節規範建構/解構/複製/繼承/多態/封裝等核心機制的最佳實踐。

1. 建構函式職責:僅做平凡初始化,複雜邏輯移至 Init()

  • 建構函式難回報錯誤(禁用異常)、失敗導致不確定狀態、虛擬函式不會分派到衍生類、全域物件建構早於 main() 可能違反依賴假設。
  • **結論**:建構函式只初始化成員為基本值,需有意義初始化者提供 Init() 方法並以成員旗標標記初始化狀態。

2. 預設建構函式:有成員變數且無其他建構函式時必須顯式定義

  • 編譯器產生的預設建構函式**不初始化**成員變數。
  • 若已定義其他建構函式,編譯器不再提供預設版本,**必須自行提供**。
  • 繼承現有類別且無新增成員時,可不定義預設建構函式。

3. 明確建構函式:單參數建構函式必加 explicit

  • 防止隱式轉換:Foo(string) 會讓 func(Foo) 接受 string 參數自動轉換。
  • **規定**:所有單參數建構函式加 explicit。例外:複製建構函數、刻意設計為透明包裝器的類別(註解說明)。

4. 複製建構函式與賦值運算子:預設禁用,確有需要時實作

  • 隱式複製是效能問題與 Bug 溫床;STL 容器要求可複製,但應**存放指標/智慧指標**而非值。
  • **標準作法**: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);
};
  • 確需可複製時:公開實作並在賦值運算子檢查自我賦值。

5. 結構體 vs 類別:純資料聚合用 struct,其他用 class

  • struct:僅含資料成員、相關常數,**無行為函式**(建構/解構/初始化/驗證等除外)。直接存取成員。
  • class:含行為函式、不變條件、封裝邏輯。
  • STL 仿函式/特徵類別可用 struct。
  • **注意**:成員命名規則不同(struct 無底線結尾)。

6. 繼承:組合優於繼承,僅用 public 繼承

  • 實作繼承:重用基類代碼,但實作分散難理解、無法改寫非虛擬函式、基類資料佈局影響衍生類。
  • 介面繼承:僅繼承方法簽章,編譯器可檢查。
  • **規定**:所有繼承為 public;"is-a" 關係才繼承,"has-a" 用組合;有虛擬函式類別**必須**有虛擬解構函式;衍生類覆寫虛擬函式**明確加 virtual**;僅衍生類存取的成員設 protected,**資料成員永遠 private**。

7. 多重繼承:極度受限

  • 僅當**最多一個基類含實作**,其他皆為純介面類(以 Interface 為後綴)時允許。
  • 通常能找到更清晰的單繼承/組合方案。Windows COM 例外見第八篇。

8. 介面類別:以 Interface 為後綴(非強制)

  • 純介面條件:純虛擬函式/靜態函式、無非靜態資料成員、無建構函式(有則 protected 無參數)、基類亦為純介面。
  • **必須提供虛擬解構函式**(非純虛擬)確保正確銷毀。

9. 運算子多載:一般禁用,特定場景配合模板/標準庫時允許

  • 缺點:混淆效能直覺、難搜尋呼叫處、指標運算陷阱、operator& 妨礙前置宣告。
  • 改用具名函式:Equals()/CopyFrom()。
  • 例外:operator<<(ostream&, const T&) 等標準慣用法,**須文件說明理由**;STL 容器 Key 比較用仿函式型別而非多載 operator==/operator<。

10. 存取控制:資料成員 private,提供存取函式

foo_ + foo()/set_foo(),存取函式通常內聯於標頭檔。

11. 宣告順序:public → protected → private;每區塊內:typedef/enum → 常數 → 建構 → 解構 → 成員函式 → 資料成員

DISALLOW_COPY_AND_ASSIGN 置於 private 區塊末尾。實作檔函式順序對應宣告順序。大型函式勿內聯於類別定義。

12. 短小函式:傾向簡潔,超過 40 行考慮拆分

長函式修改風險高,拆分利於閱讀、測試、複用。重構既有長函式無需恐懼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved