struct和class的根本区别在于默认访问权限和默认继承权限:struct默认成员和继承均为public,class默认均为private;二者功能完全等价,但语义和使用惯例不同。

struct 和 class 在 C++ 里只差一个默认访问控制
如果你只是想存几个字段、不封装行为、也不需要继承或多态,struct 和 class 在功能上完全等价。唯一的语法差异是:struct 默认成员是 public,class 默认是 private。除此之外,它们都能有构造函数、析构函数、运算符重载、模板参数、友元、静态成员……所有你能想到的类特性。
用 struct 更符合直觉,也更少写样板代码
纯数据类型(POD 或标准布局类型)用 struct 是行业惯例,比如 Point、Rect、Vec3。这样做的好处很实在:
- 不用手动加
public:—— 少写一行,少一个出错点 - 初始化列表更自然:
Point p{1, 2};可读性比Point p(1, 2);更直观 - 和 C 兼容性更好(如果字段顺序/对齐没被破坏),方便与 C API 交互或做内存映射
- 编译器更容易识别为 trivial 类型,有利于 memcpy、零成本抽象等优化
别因为“struct 是 C 风格”就硬套 class
有人觉得“C++ 应该统一用 class”,结果给纯数据类型加一堆 private: + public: 切换,还写一堆无意义的 getter/setter。这反而掩盖了意图,增加维护成本。真实项目中常见错误包括:
- 用
class定义Config,但所有字段又全设成public—— 白费了封装意图 - 为了“看起来像 class”,加空构造函数,结果阻止了聚合初始化(
MyClass x{1,2};编译失败) - 字段加了
const或引用后,忘记显式定义构造函数,导致无法聚合初始化
例外情况:当你要加语义约束时,class 更合适
一旦出现以下任一需求,就该切回 class 并把字段设为 private:
立即学习“C++免费学习笔记(深入)”;
- 需要保证字段有效性(比如
age不能为负) - 字段之间有不变量(如
width和height必须同号) - 后续可能加逻辑(比如自动归一化、缓存计算值)
- 要参与多态(作为基类被继承)
这时候用 class 不是风格问题,而是明确传达“这个类型的行为比数据更重要”。哪怕现在只有字段,只要你知道它未来大概率要加校验,早用 class 省得后期重构字段访问权限。
真正容易被忽略的是:是否支持聚合初始化({...})和是否是标准布局类型,往往比用 struct 还是 class 本身影响更大。字段顺序、对齐、是否有用户定义构造函数——这些细节才决定你能不能安全地 memcpy 或和 C 互操作。


















