C++ struct和class区别 C++ 默认访问权限与继承方式对比【常识】

14次阅读

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

C++ struct和class区别 C++ 默认访问权限与继承方式对比【常识】

struct 默认访问权限是 public

在 C++ 中,structclass 的唯一语言级区别就是默认成员访问权限:struct 默认是 publicclass 默认是 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 的默认是 privatestruct 的默认是 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 等元编程判断,只看布局和成员,不区分 structclass
  • 混合使用时容易踩坑:比如 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_vstd::is_trivial_v

text=ZqhQzanResources