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

C++ 中 struct 與 class 深度解析:語法相近,思想迥異

     編輯:C++ 入門

表象:幾乎相同的語法實體

C++ 為兼容 C,保留 `struct` 並大幅擴充:可含成員函數、建構子/解構子、繼承、虛函數、模板特化……與 `class` 唯一語法差別在於預設存取層級:

  • `struct`:預設 `public` 繼承、預設 `public` 成員。
  • `class`:預設 `private` 繼承、預設 `private` 成員。

良好的編碼規範會顯式標註 `public:`/`private:`,因此實務上兩者可互換。但若止步於語法,便忽略了 C++ 設計者的深意。

本質:從「資料聚合」到「介面契約」的演進

C 時代的 struct:被動資料容器

C 語言面向過程,資料(`struct`)與操作(函數)分離。`struct` 只是記憶體佈局的標籤,無行為、無封裝、無生命週期管理。

C++ 的 class:主動的物件實體

面向物件主張「資料與操作合一」。`class` 體現封裝、不變式、RAII、多型——它是「有行為的類型」。

C++ 的 struct:被賦予新使命的「介面」

C++ 無 Java 式 `interface` 關鍵字,但需表達「純抽象介面」概念。社群慣例(含 Microsoft 官方庫)將 `struct` 定位為:

  • 純虛函數集合(介面定義)
  • 無資料成員、無建構邏輯
  • 公開繼承、公開解構子(或 `protected` 虛解構子)

例如:


struct IRenderer { // 介面契約
    virtual void Draw() = 0;
    virtual ~IRenderer() = default;
};

class OpenGLRenderer : public IRenderer { // 實作細節
    // ...
};

架構層面的「紳士協定」

維度classstruct (慣例)
語義角色具體實作、資料擁有者、不變式維護者介面定義、POD 資料傳輸、Traits 特徵類
繼承意圖is-a 實作繼承、功能擴充is-a 介面繼承、契約遵循
封裝程度高(private 為主)低(public 為主,甚至全 public)
典型場景業務實體、引擎核心類、管理器COM 介面、回調介面、序列化 DTO、型別萃取

結語:工具服務於思想

`struct` vs `class` 之爭,本質是「被動資料」與「主動契約」的架構分野。語法允許你用 `class` 寫介面、用 `struct` 寫實作,但遵循慣例能讓程式碼「說人話」:看到 `struct Ixxx` 即知是介面,看到 `class XxxImpl` 即知是實作。這才是 C++ 給資深工程師的「隱性文檔」價值。

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