## C++ struct vs class ## 判别规则(核心,唯一要记的) 1. **看"默认访问权限"**:成员默认 public → struct;成员默认 private → class 2. **看"默认继承方式"**:继承默认 public → struct;继承默认 private → class 一句话:**"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)。区别只在默认访问权限这一层,不体现在内存里。 ## 为什么 C++ 保留 struct - **兼容 C 代码**:C 程序能无缝迁移到 C++ - class 是新增关键字:强调**封装/不透明类型**的面向对象语义 - 用途区别是**习惯和公司规范**,不是功能限制 ## struct/class vs union(本质区别) | | struct/class | union | | ---- | ---------------- | ----------------------------------- | | 内存 | 成员内存**累加** | 成员**共用一块**内存,大小=最大成员 | | 访问 | 所有成员同时有效 | 同一时刻只有一个成员有效 | | 用途 | 组合数据 | 协议多解析方式、节省内存、类型转换 | ## 变体验证(3 题,全过=学会) 1. `struct Point { int x, y; };` 外面写 `Point p; p.x = 10;` → **能编译**(struct 默认 public) 2. 陷阱题:`class A { int x; };` 外面写 `A a; a.x = 5;` 报错,改成 `struct A` 就能编译 → **对**(class 默认 private,struct 默认 public) 3. 陷阱题:"struct 是给数据用的,class 是给带方法的类用的,不能混用" → **错**,两者功能完全相同,区分是习惯/规范 ## 口述要点(面试怎么讲) - **结论先行**:功能完全相同,唯一区别是默认访问权限(public vs private)+ 默认继承方式(public vs private 继承) - **为什么保留 struct**:兼容 C 代码,C 程序无缝迁移;class 强调封装语义 - **有没有构造析构**:两者都有;sizeof 无区别(内存布局相同) - **union 区别**:struct/class 内存累加,union 共用一块取最大,同一时刻只有一个成员有效(嵌入式常用于协议解析) - **易错点**:以为 struct 不能有方法/继承;以为 struct 是 C 语言定义无构造析构;把 union 当 struct 用 ## 关系网络 | 相邻概念 | 关系 | 孤立理解会犯的错 | | ------------------------- | ---------------------------------------------------------- | ---------------------------- | | 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 --- _每主题一页,复习时只翻本目录。_