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

C++ class 與 struct 區別:默認訪問權限、繼承方式與模板支援的三大核心差異

     編輯:C++ 基礎

核心差異速覽

歷史緣由

C++ 保留 C 的 struct 並擴展支援成員函數,為兼容 C 代碼、給 C 程序員歸屬感。但語義上:

  • class:封裝、資料隱藏、面向對象主力
  • struct:純資料聚合、POD 型別、介面定義

實戰驗證:struct 默認 public

struct Student {
    Student(char* name, int age, float score)
        : m_name(name), m_age(age), m_score(score) {}
    void show() { cout << m_name << " " << m_age << " " << m_score << endl; }
    char* m_name; int m_age; float m_score;  // 默認 public
};

int main() {
    Student stu("小明", 15, 92.5f);
    stu.show();  // 正常:成員預設 public
    Student* p = new Student("李華", 16, 96);
    p->show();
}

若改為 class,show() 和成員變數變為 private,main 中訪問將編譯錯誤。

模板參數限制

template <class T> void func() { }  // 合法
template <struct T> void func() { }  // 錯誤!struct 不能用於模板參數

模板參數只能用 class 或 typename。

現代 C++ 最佳實踐建議

  1. 定義類用 class:明確封裝意圖,默認 private 安全
  2. 定義純資料結構用 struct:POD、DTO、配置結構、無行為的資料載體
  3. 介面類可用 struct:全 public 純虛函數,語義清晰
  4. 模板參數統一用 typename:語義更清晰,避免與 class 關鍵字混淆
  5. 公開 API 盡量用 class:強制封裝,防止誤用內部細節

總結

class 與 struct 在 C++ 中功能幾乎等價(均支援成員函數、繼承、多態),唯三大默認差異:成員權限、繼承方式、模板參數資格。語義導向選擇:class 做封裝行為主體,struct 做資料聚合/介面。這是專業 C++ 代碼風格的重要體現。

  1. 上一篇文章:
  2. 下一篇文章:
  • --热点文章
  • Copyright © 程式碼之家 All Rights Reserved
    特性classstruct
    成員默認訪問權限privatepublic
    繼承默認方式privatepublic
    模板參數聲明可用 template <class T>不可用 (僅 typename)