3.Union,Struct,Class的异同点

51 阅读2分钟

核心区别(一句话概括)

1.Struct vs Class : 唯一的区别在于 默认的访问权限 不同。 struct 默认是 public 的,而 class 默认是 private 的。

2.Union vs Struct / Class : 最大的区别在于 内存分配方式 。 union 的所有成员共享同一块内存空间,而 struct / class 的每个成员都有自己独立的内存空间。

2. 详细异同点

可以像下面这样,用一个表格来清晰地对比:

image.png

3. 使用场景和思想(体现你的理解深度)63.......

  • 什么时候用 Struct ?

    • 当你只是想把一堆数据 打包 在一起,作为一个整体来传递或使用时。
    • 当你希望这些数据默认是对外 公开 的,不需要复杂的封装和权限控制时。
    • 思想 :它更偏向于C语言的思维,是一个“数据集合”。例如,定义一个点的坐标 struct Point { float x; float y; }; 。
  • 什么时候用 Class ?

    • 当你不仅要打包数据,还要提供操作这些数据的**方法(函数)**时。
    • 当你需要对内部数据进行 保护 ,不希望外部随意修改,需要实现 封装、继承、多态 等面向对象特性时。
    • 思想 :它是C++面向对象的基石,强调的是“抽象”和“封装”,将数据和行为绑定在一起,形成一个有机的“对象”。例如,一个“文件读写类”,它有文件路径、读写位置等私有数据,同时提供 open() , read() , write() 等公有方法。
  • 什么时候用 Union ?

    • 场景1:节省内存。 当你有一组变量,但在任何时刻你都 确定只会使用其中一个 时。比如,一个图形对象,它要么是圆形(需要半径),要么是矩形(需要长和宽),可以用 union 来存储这些尺寸,因为一个图形不可能同时既是圆又是矩形。
    • 场景2:类型双关 (Type Punning)。 当你想用一种数据类型的位模式来查看另一种数据类型时。这是一个比较底层的技巧,比如想看看一个 float 类型的二进制表示在 int 类型下是什么样的。
  • 总结一下对面试官说的话:

    • “ Struct 和 Class 在功能上几乎是等价的,唯一的区别就是默认访问权限, Struct 是 public , Class 是 private 。在实践中,我们通常用 Struct 来表示纯粹的数据集合,用 Class 来表示具有复杂行为和封装需求的对象。

    • 而 Union 则完全不同,它的核心在于内存共享,所有成员共用一块内存,大小由最大的成员决定。这使得它非常节省空间,但同一时间只能有效地使用它的一个成员。它主要用于节省内存或一些底层类型转换的特殊场景。”