19.6 union: 联合体,一种节省空间的类
- 分配给 union 的空间至少可以容纳它的最大数据成员
- 默认情况下,union 的成员都是公有的,这一点和 struct 相同
- union 既不能继承自其他类,也不能作为基类。所以 union 中不能含有虚函数
- 为 union 的一个数据成员赋值会使其他数据成员变成未定义状态
示例代码如下:
```cppinclude
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; } ```
结果
调试解析
由上述概念可知:分配给 union 的空间至少可以容纳它的最大数据成员,所以按空间 3 计算。
- 初始时,所有变量均为 0
- x 被赋值 4 后,p 和 k 也均被赋值 4(p 和 k 为各部分第一个空间的变量)
- 同理 y 被赋值 5 后, q 也会随之变化
- 然后 z 被赋值 6,这里其他成员已经没有更多的空间了
- 然后 p 被赋值 1,导致 x 和 k 变为 1
- q 被赋值 2,y 也随之变化