C++ 為兼容 C,保留 `struct` 並大幅擴充:可含成員函數、建構子/解構子、繼承、虛函數、模板特化……與 `class` 唯一語法差別在於預設存取層級:
良好的編碼規範會顯式標註 `public:`/`private:`,因此實務上兩者可互換。但若止步於語法,便忽略了 C++ 設計者的深意。
C 語言面向過程,資料(`struct`)與操作(函數)分離。`struct` 只是記憶體佈局的標籤,無行為、無封裝、無生命週期管理。
面向物件主張「資料與操作合一」。`class` 體現封裝、不變式、RAII、多型——它是「有行為的類型」。
C++ 無 Java 式 `interface` 關鍵字,但需表達「純抽象介面」概念。社群慣例(含 Microsoft 官方庫)將 `struct` 定位為:
例如:
struct IRenderer { // 介面契約
virtual void Draw() = 0;
virtual ~IRenderer() = default;
};
class OpenGLRenderer : public IRenderer { // 實作細節
// ...
};
| 維度 | class | struct (慣例) |
|---|---|---|
| 語義角色 | 具體實作、資料擁有者、不變式維護者 | 介面定義、POD 資料傳輸、Traits 特徵類 |
| 繼承意圖 | is-a 實作繼承、功能擴充 | is-a 介面繼承、契約遵循 |
| 封裝程度 | 高(private 為主) | 低(public 為主,甚至全 public) |
| 典型場景 | 業務實體、引擎核心類、管理器 | COM 介面、回調介面、序列化 DTO、型別萃取 |
`struct` vs `class` 之爭,本質是「被動資料」與「主動契約」的架構分野。語法允許你用 `class` 寫介面、用 `struct` 寫實作,但遵循慣例能讓程式碼「說人話」:看到 `struct Ixxx` 即知是介面,看到 `class XxxImpl` 即知是實作。這才是 C++ 給資深工程師的「隱性文檔」價值。