一句话:"C++ 里 struct 和 class 功能完全相同,唯一区别是默认访问权限和默认继承方式:struct 默认 public,class 默认 private。"
struct 和 class 在 C++ 中功能几乎完全相同(内存布局、类型系统、构造/析构、继承都一致),核心区别是默认访问权限(struct=public,class=private)和默认继承方式(struct=public 继承,class=private 继承)。
| struct | class | |
|---|---|---|
| 默认访问权限 | public | private |
| 默认继承方式 | public 继承 | private 继承 |
| 模板参数(C++11前) | 不能用(必须用 class/typename) | 能用 |
| 内存布局 | 相同 | 相同 |
| 类型系统 | 相同 | 相同 |
| 能否有方法/构造/析构 | ✅ 能 | ✅ 能 |
| 典型用途 | POD 数据、聚合体 | 封装、继承、多态 |
| C 语言 struct | C++ struct |
|---|---|
| 只能放数据成员 | 可以有方法、构造、析构、继承 |
| 没有访问控制 | 有访问控制(默认 public) |
| 不能用 template | 可以用 template |
两者 sizeof 无区别:同样的成员,struct 和 class 的内存布局、对齐、大小完全一致(成员对齐规则相同,见主题14)。区别只在默认访问权限这一层,不体现在内存里。
| struct/class | union | |
|---|---|---|
| 内存 | 成员内存累加 | 成员共用一块内存,大小=最大成员 |
| 访问 | 所有成员同时有效 | 同一时刻只有一个成员有效 |
| 用途 | 组合数据 | 协议多解析方式、节省内存、类型转换 |
struct Point { int x, y; }; 外面写 Point p; p.x = 10; → 能编译(struct 默认 public)class A { int x; }; 外面写 A a; a.x = 5; 报错,改成 struct A 就能编译 → 对(class 默认 private,struct 默认 public)| 相邻概念 | 关系 | 孤立理解会犯的错 |
|---|---|---|
| struct vs union(主题15) | struct/class 内存叠加,union 共用一块内存取最大 | 以为 union 能同时存多个成员 |
| 结构体对齐(主题14) | struct/class 成员对齐规则相同 | 以为 class 有特殊对齐 |
| C 语言 struct | C++ struct = C struct + 面向对象能力(方法/访问控制/继承) | 把 C++ struct 当 C struct 用 |
| 封装/继承 | class 强调封装,struct 强调聚合数据 | 以为 struct 不能继承 |
2026-08-26
每主题一页,复习时只翻本目录。