struct默认成员访问权限是public,且默认继承方式为public;class则分别为private和private;二者在虚函数、内存布局等所有其他特性上完全一致。

struct 默认成员访问权限是 public
在 C++ 中,struct 和 class 的**唯一语言级本质区别**就是默认的成员访问权限:struct 默认是 public,class 默认是 private。其他所有行为(继承方式、内存布局、模板参数支持、能否定义构造函数/析构函数/虚函数等)完全一致。
这意味着下面两个定义在语义上等价(仅访问权限不同):
struct S {
int x; // 等价于 public: int x;
void f() { } // 等价于 public: void f() { }
};
class C {
int x; // 等价于 private: int x;
void f() { } // 等价于 private: void f() { }
};
继承时的默认访问限定符也不同
除了成员访问权限,struct 和 class 在**未显式指定继承方式**时,也采用不同的默认值:
-
struct D : B { };等价于struct D : public B { }; -
class D : B { };等价于class D : private B { };
这个差异常被忽略,但直接影响派生类能否通过对象访问基类的 public 成员。例如:
立即学习“C++免费学习笔记(深入)”;
struct Base { int val = 42; };
struct Derived : Base { }; // public 继承 → Derived().val 可访问
class Derived2 : Base { }; // private 继承 → Derived2().val 编译错误
实际选型应基于语义而非技术限制
很多团队约定:用 struct 表示纯数据聚合(POD 或类似 C 风格的 aggregate),用 class 表示封装了行为和不变量的类型。但这只是风格约定,编译器不强制。
需要注意的细节:
- 即使
struct有private成员或虚函数,它仍是合法的struct - 空
struct和空class的大小都是 1(满足对象唯一地址要求) -
标准库中
std::tuple、std::optional内部大量使用struct,不是因为“更轻量”,而是为了默认公开其内部字段(如tuple_element的实现)
别依赖“struct 更快”或“class 才能多态”这类误解
性能、虚函数表、ABI 兼容性、RTTI 支持……这些跟用 struct 还是 class 关键字**完全无关**,只取决于你是否定义了虚函数、是否开启 RTTI、是否有非 POD 成员等实际内容。
一个典型误判场景:
- 写
struct Widget { virtual ~Widget() = default; };—— 它照样有虚表,和class版本生成的汇编一模一样 - 写
class Vec3 { public: float x, y, z; };—— 它和struct版本在内存布局、对齐、拷贝效率上毫无差别
真正影响二进制兼容性和 ABI 的,是成员顺序、padding、是否含虚函数、是否为标准布局类型(is_standard_layout_v),而不是关键字本身。











