C++中struct和class仅有两个本质区别:一是默认成员访问权限不同,struct为public、class为private;二是默认继承方式不同,struct为public继承、class为private继承;其余功能完全一致。

只有两个区别:默认成员访问权限不同、默认继承方式不同。其余所有功能完全一致。
默认成员访问权限是唯一本质区别
这是编译器行为层面的硬性差异,直接影响代码能否通过编译。
-
struct未加public/private修饰的成员,默认是public;外部可直接读写 -
class未加修饰的成员,默认是private;外部访问会触发编译错误,如error: 'x' is private within this context - 一旦显式写出访问标号(比如
public:),这个“默认”就失效了,struct里也能全写private:,class里也能全写public:
示例:
struct S { int x; }; // x 可被 s.x = 42; 直接赋值
class C { int y; }; // y 不可被 c.y = 42; 访问 —— 编译失败
默认继承方式影响派生类的可见性
继承时没写 public/private/protected,编译器按类型自动补上,这决定了基类成员在派生类中的访问级别。
立即学习“C++免费学习笔记(深入)”;
-
struct D : B {}等价于struct D : public B {} -
class D : B {}等价于class D : private B {} - 注意:决定默认方式的是**派生类的声明关键字**,不是基类。即
class D : struct B {}仍是private继承 - 实际项目中几乎总是显式写出继承方式,所以这个“默认”极少被感知,但面试或阅读老代码时容易踩坑
其他所谓“区别”都是约定或历史残留
比如 “struct 是数据容器,class 是对象” 这类说法,只是社区习惯,编译器不强制也不检查。
- 两者都支持构造函数、析构函数、虚函数、模板参数(
template<typename T>或template<class T>都合法,但template<struct T>语法错误) - 两者都能用大括号初始化(
MyStruct s{1, 2};),前提是满足聚合类型条件(无用户定义构造函数、无private成员等) -
struct在 C 兼容场景下更自然(比如与 C ABI 交互、内存布局敏感代码),但这不是 C++ 语言规定的限制
真正容易被忽略的点是:当你把一个 class 改成 struct(或反之)却没调整访问标号或继承方式时,可能悄无声息地改变封装边界或继承语义 —— 尤其在大型继承体系中,这种改动可能破坏调用方假设。


















