结构体与类仅默认访问权限和继承方式不同:struct默认public,class默认private;二者均可定义构造函数、虚函数等。常见错误是误以为struct无封装性而直接访问未初始化成员。

结构体不是类的简化版,它默认是公开的、不带默认行为的内存布局工具;用错访问控制或初始化方式,编译器不会提醒你,但运行时会出问题。
struct 和 class 到底差在哪?
差别只在默认访问权限和默认继承方式,其他完全一致。struct 默认 public,class 默认 private;两者都能有构造函数、成员函数、虚函数、模板特化——只要你不手动写 private:,struct 里所有成员天然可直接读写。
常见错误现象:struct Point { int x, y; }; Point p{}; cout 能编译通过,但若误写成 <code>class Point { int x, y; }; 就会报 ‘x’ is inaccessible。
- 别用 struct 暗示“只是数据”,它能做的事比你想的多
- 如果结构体要被序列化(比如写进文件或网络传输),优先用 struct +
std::is_standard_layout_v<t></t>校验 - C++20 起,
constexpr构造函数在 struct 中和 class 中行为一致,不用额外顾虑
初始化 struct 的三种写法及陷阱
老式 C 风格初始化({1, 2})只在聚合类型(aggregate)下安全;一旦加了构造函数、私有成员、基类,就失效。
立即学习“C++免费学习笔记(深入)”;
使用场景:跨 C/C++ 边界传参、嵌入式寄存器映射、POD 类型配置块。
常见错误现象:struct S { int a; S() : a(0) {} }; S s = {1}; —— 编译失败,因为有了用户定义构造函数,不再是聚合类型。
- 想保留
{...}初始化?删掉任何构造函数,或改用= default - 需要默认值又想聚合初始化?C++11 起支持
int a = 42;这种内联初始化,不影响聚合性 -
S s{};是零初始化(a变成 0),S s;是未初始化(a是垃圾值),这点容易被忽略
struct 成员函数要不要写?
要,只要逻辑属于这个数据集合本身。struct 不是“不能有函数”的代名词;不写反而导致外部函数依赖增多、接口分散。
性能影响几乎为零:成员函数本质就是带隐式 this 参数的普通函数,内联与否看编译器优化,跟 struct/class 无关。
常见错误现象:把 bool valid() const 写成全局 bool is_valid(const S&),结果多个文件重复实现,且无法随 struct 一起迁移。
- 构造函数推荐显式写,哪怕只是
S() = default;,避免意外生成不满足需求的默认构造 - 重载
operator==很值得:C++20 支持auto operator(const S&) const = default;自动生成全部比较操作符 - 避免在 struct 里写复杂析构逻辑;如果有资源管理需求,该用 class + RAII
最容易被忽略的是:struct 的内存对齐和字段顺序直接影响 sizeof 和 ABI 兼容性。改一个 int 成 int64_t 可能让整个结构体大小翻倍,而你可能根本没意识到它正被用于 mmap 或 socket sendto。










