| 特性 | class | struct |
| 成員默認訪問權限 | private | public |
| 繼承默認方式 | private | public |
| 模板參數聲明 | 可用 template <class T> | 不可用 (僅 typename) |
歷史緣由
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++ 最佳實踐建議
- 定義類用
class:明確封裝意圖,默認 private 安全
- 定義純資料結構用
struct:POD、DTO、配置結構、無行為的資料載體
- 介面類可用
struct:全 public 純虛函數,語義清晰
- 模板參數統一用
typename:語義更清晰,避免與 class 關鍵字混淆
- 公開 API 盡量用
class:強制封裝,防止誤用內部細節
總結
class 與 struct 在 C++ 中功能幾乎等價(均支援成員函數、繼承、多態),唯三大默認差異:成員權限、繼承方式、模板參數資格。語義導向選擇:class 做封裝行為主體,struct 做資料聚合/介面。這是專業 C++ 代碼風格的重要體現。
- 上一篇文章: C++ string 類完全指南:構造、輸入輸出、操作、轉換與高效字符串處理實戰
- 下一篇文章: C++ friend 友元函數與友元類:打破封裝邊界的受控訪問機制
Copyright ©
程式碼之家 All Rights Reserved