C++中struct默认访问权限为public,class为private,继承时struct默认public继承、class默认private继承,二者仅此语法差异,语义上显式指定后完全等价。

struct 默认访问权限是 public
在 C++ 中,struct 和 class 的唯一语言级区别就是默认成员访问权限:struct 默认是 public,class 默认是 private。这不是风格约定,而是标准明确定义的行为。
这意味着以下两段代码等价:
struct S { int x; }; // x 是 public
class C { public: int x; }; // 显式声明为 public
但如果不加修饰符,class C { int x; }; 中的 x 就无法从外部访问。
- 这个规则也适用于基类继承:不写
public/private/protected时,struct默认用public继承,class默认用private继承 - 成员函数、嵌套类型、静态成员,全都受同一默认权限控制
- 一旦显式写出访问标号(如
private:),后续所有成员都按新标号生效,和 struct/class 类型无关
class 默认继承方式是 private
继承时省略访问说明符,class 的默认是 private,struct 的默认是 public。这直接影响派生类对外暴露的接口。
立即学习“C++免费学习笔记(深入)”;
struct Base { void f(); };
struct D1 : Base {}; // 等价于 struct D1 : public Base {}
class D2 : Base {}; // 等价于 class D2 : private Base {}
于是 D2 的用户无法通过 D2 对象调用 f()(因为继承关系被隐藏),而 D1 可以。
- 这种差异常被误认为“struct 更适合做 POD”,其实只是默认行为不同;只要显式写
public,二者语义完全一致 - 模板参数、SFINAE、
is_standard_layout等元编程判断,只看布局和成员,不区分struct和class - 混合使用时容易踩坑:比如
class A : B {}看起来像公开继承,实际却是私有继承
什么时候该用 struct,什么时候该用 class
没有强制规范,但行业惯例已形成清晰信号:
- 用
struct表示数据聚合体(data-only)、POD 类型、C 兼容结构体、模板元编程中的 trait 类型(如std::is_integral) - 用
class表示封装完整、有不变量、需控制访问、带构造/析构逻辑的类型 - 即使
struct加了成员函数或private成员,只要语义仍是“透明数据块”,仍可接受;反之,class里全 public 成员也不违法,只是违背直觉
关键不是语法,而是传达意图:struct 暗示“你可以直接读写字段”,class 暗示“请走我提供的接口”。
别被“C 兼容”误导,真正影响 ABI 的是布局而非关键字
是否能被 C 代码安全使用,取决于是否满足 standard-layout 要求,而不是用了 struct 还是 class。
- 一个
class只要所有非静态成员同为 public 或同为 private、无虚函数、无虚基类、第一个非静态成员类型相同,就仍是 standard-layout - 反之,
struct若加了虚函数或多重继承,也会失去 C 兼容性 - ABI 相关工具(如
extern "C"函数参数、memcpy安全性)只检查 layout,不查关键字
所以不要因为“想兼容 C”就硬用 struct,而应检查 std::is_standard_layout_v 和 std::is_trivial_v。










