定义:
union 是用户定义的类型,其中所有成员都共享同一个内存位置。 这意味着在任何给定时间,联合都不能包含来自其成员列表的多个对象。 这还意味着无论联合具有多少成员,它始终仅使用足以存储最大成员的内存。
即联合只保存最后写入的那个成员。赋入新值则冲去旧值。
所以一定要小心,因为这是由你负责确保:始终访问的是写入的最后一个成员。
联合不能存储引用。 联合不支持继承,因此联合本身不能用作基类、继承自另一个类或具有虚函数。
联合可以有成员函数。
好处:
具有大量对象和/或内存有限时,联合可用于节省内存。
而且可以随时改变它的值,这些值是不同类型的。
声明:
union [name] { member-list };
示例:
// declaring_a_union.cpp union RecordType // Declare a simple union type { char ch; int i; long l; float f; double d; int *int_ptr; }; int main() { RecordType t; t.i = 5; // t holds an int t.f = 7.25 // t now holds a float }
无限制的联合 (C++11)
在 C++03 及更低版本中,联合可以包含具有类类型的非静态数据成员(class),只要该类型没有用户提供的构造函数、析构函数或赋值运算符即可。
在 C++11 中,消除了这些限制。 如果在联合中包含这样一个成员,则编译器会自动将不是用户提供的任何特殊成员函数标记为已删除。 如果联合是类或结构中的匿名联合,则类或结构的不是用户提供的任何特殊成员函数都会标记为已删除。
union { member-list }
匿名联合中声明的名称可直接使用,就像非成员变量一样。 因此,匿名联合中声明的名称必须在周边范围中是唯一的。
除了联合成员数据中列出的限制之外,匿名联合还受其他限制:
-
- 如果在文件或命名空间范围内声明联合,则还必须将它们声明为“静态的”。
- 它们可以只具有公共成员;匿名联合中的私有成员和受保护的成员会生成错误。
- 它们不能具有函数成员。
时间: 2024-11-07 23:42:12