C++中struct与class的核心区别仅有两个:默认成员访问权限(struct为public,class为private)和默认继承方式(struct为public继承,class为private继承),其余功能完全一致。

只有两个默认行为差异:成员访问权限和继承方式;其余所有功能完全一致。
struct 默认 public 成员,class 默认 private 成员
这是最常踩坑的地方。没写 public: 或 private: 时,struct 里所有成员(变量、函数)自动可被外部访问;class 则全部不可见,连构造函数调用都可能失败。
- 错误现象:
error: 'x' is private within this context—— 你写了class Point { int x; };然后试图访问p.x - 正确写法:
class Point { public: int x; };或直接换用struct省掉这行 - 注意:两者都支持混用访问控制符,
struct可以有private:成员,class也可以有public:区块
struct 默认 public 继承,class 默认 private 继承
继承时没写关键字,行为天差地别。这个坑比访问权限更隐蔽,因为编译错误可能出现在子类外部使用基类接口时。
- 错误现象:
error: 'x' is inaccessible—— 你写了class Derived : Base {};,但Base::x是public,却在Derived实例中无法访问 - 原因:
class默认private继承,把基类的public成员降级为private;而struct Derived : Base {};等价于struct Derived : public Base {}; - 实操建议:显式写出继承方式,比如
class Derived : public Base {};,避免依赖默认行为
为什么不能只看“语义约定”就选 struct 或 class
工程中常听说“struct 存数据,class 封装逻辑”,但这不是语言规则,而是团队习惯。真这么用,容易忽略底层约束带来的副作用。
立即学习“C++免费学习笔记(深入)”;
- 内存布局:两者无强制差异,
struct并不“更紧凑”,class也非“更松散”——实际对齐由成员类型和#pragma pack决定 - C 兼容性:只有纯 POD(Plain Old Data)的
struct才能安全传给 C 函数;加了虚函数、非 trivial 构造函数的struct就失去兼容性 - 模板推导、SFINAE、ADL 行为完全一致,不存在语法层面的特殊待遇
真正需要警惕的是:当你把一个 class 改成 struct(或反之),只改关键字却不调整访问控制和继承修饰符,大概率会触发一连串编译错误——这不是设计问题,是默认行为切换导致的权限塌方。


















