44.C++-struct-vs-class.md 3.9 KB

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


每主题一页,复习时只翻本目录。