struct默认访问权限为public,class默认为private,这是二者最核心区别;其他方面如继承默认权限等也由此衍生。

struct 和 class 的默认访问权限不同
这是最核心、最实际的区别:在 C++ 中,struct 默认成员(包括成员变量和成员函数)是 public,而 private。
这意味着,不写访问说明符时:
-
struct S { int x; void f(); };→x和f()都可直接访问 -
class C { int x; void f(); };→x和f()默认不可从外部访问
其他所有访问控制行为(如 protected、继承时的权限变化)完全一致,仅默认值不同。
struct 和 class 在继承时的默认访问级别也不同
当不显式指定继承方式时,struct 默认是 public 继承,class 默认是 private 继承。
立即学习“C++免费学习笔记(深入)”;
例如:
struct D1 : B { }; // 等价于 struct D1 : public B { }
class D2 : B { }; // 等价于 class D2 : private B { }
这个差异常被忽略,尤其在写模板或泛型基类时,可能导致意外的访问限制或编译错误。
语义习惯与实际使用并无强制约束
C++ 标准并未规定 struct 只能用于纯数据,class 才能封装逻辑——两者语法能力完全等价。
但实践中:
- 用
struct通常暗示“轻量、公开、数据导向”,比如Point、Config、POD 类型 - 用
class更倾向表达“封装、接口抽象、有不变量约束”的类型 - 混用不会报错,但可能让协作者困惑,比如在
struct里加私有成员+复杂构造函数,就违背直觉
编译器不检查语义,只看语法;但人会。
模板参数和特化中 struct/class 可互换
在模板声明、特化、别名中,struct 和 class 关键字可自由替换,不影响匹配:
templatestruct Wrapper { T val; };
和
templateclass Wrapper { T val; };
这种写法是非法的——注意:struct 不能用作模板参数关键字,只有 class 或 typename 合法。但反过来,声明一个类模板时用 class,特化时用 struct 完全没问题,因为特化的是类型名,不是关键字本身。
真正容易出错的是跨头文件时,有人用 struct 声明,有人用 class 定义同一类型,导致 ODR 违反(尤其在未启用 -Wodr 时静默失败)。










