面向深入理解语义、语法细节、初始化行为、内存模型、比较运算符重载、仿函数、模板配合 STL 等进阶应用。
一句话速记:除了默认访问/继承权限不同,
struct与class在语言层面几乎等价;如何选用主要是“语义约定”问题:公开数据聚合=struct,封装不变式=class。
| 项目 | struct |
class |
备注 |
|---|---|---|---|
| 默认成员访问 | public |
private |
显式写访问修饰符可统一行为 |
| 默认继承方式 | public |
private |
struct Derived : Base == public 继承 |
| 聚合初始化倾向 | 常用 | 不限 | 只与成员/构造等规则相关,与关键字无本质关系 |
| 封装语义 | 数据聚合、POD 风格 | 抽象类型、封装不变式 | 社区约定,不是语法限制 |
| 模板元编程标签 | 常用 | 可用 | 小型标签/traits常用 struct |
| STL 仿函数 | 常用 | 可用 | 历史沿用 struct comparator { ... }; |
| 友元/运算符 | 支持 | 支持 | 完全等价 |
你可在任何地方把 struct 换成 class(并补访问限定),语义一样。
struct & class 基本语法差异struct S {
int x; // 默认 public
};
class C {
int x; // 默认 private
};
等价于:
class C {
private:
int x;
};
struct Base { int x; };
struct D1 : Base {}; // 等价于 `struct D1 : public Base {}`
class D2 : Base {}; // 等价于 `class D2 : private Base {}`
访问控制关键字:public, protected, private。
struct S {
int a; // public
private:
int b; // private
protected:
int c; // protected
};
继承:
struct B { int a; };
struct D_pub : B {}; // public 继承(因 struct)
struct D_priv : private B {}; // 显式 private 继承
class C_def : B {}; // private 继承(因 class)
class C_pub : public B {}; // 显式 public