19.6 union: 联合体,一种节省空间的类

  • 分配给 union 的空间至少可以容纳它的最大数据成员
  • 默认情况下,union 的成员都是公有的,这一点和 struct 相同
  • union 既不能继承自其他类,也不能作为基类。所以 union 中不能含有虚函数
  • 为 union 的一个数据成员赋值会使其他数据成员变成未定义状态

    示例代码如下:

    ```cpp

    include

using namespace std;

union test { struct { int x; int y; int z; } u; struct { int p; int q; } m; int k; } a;

int main() { a.u.x = 4; a.u.y = 5; a.u.z = 6; a.m.p = 1; a.m.q = 2; a.k = 0; cout << a.u.x << “ “ << a.u.y << “ “ << a.u.z << “ “ << a.m.p << “ “ << a.m.q << “ “ << a.k; return 0; } ```

结果

0 2 6 0 2 0

调试解析

由上述概念可知:分配给 union 的空间至少可以容纳它的最大数据成员,所以按空间 3 计算。

  • 初始时,所有变量均为 0

image.png

  • x 被赋值 4 后,p 和 k 也均被赋值 4(p 和 k 为各部分第一个空间的变量)

image.png

  • 同理 y 被赋值 5 后, q 也会随之变化

image.png

  • 然后 z 被赋值 6,这里其他成员已经没有更多的空间了
  • 然后 p 被赋值 1,导致 x 和 k 变为 1

image.png

  • q 被赋值 2,y 也随之变化

image.png

  • 当给 k 赋值 0 时,x 和 p 变成 0

    总结

    相当于开辟一个最大数据成员大小的空间,然后大家共享这个空间,对应位置的变量被赋值就会影响联合体中相对位置一样的变量