联合(union)
联合(union)是一种特殊的类,一个联合中的数据成员在内存中的存储是互相重叠的。每个数据成员都在相同的内存地址开始。分配给联合的存储区数量是要包含它最大的数据成员所需的内存数。同一时刻只有一个成员可以被赋给一个值。
举例:
union Test
{
char cval;
int ival;
char *sval;
double dval;
};
此联合中最大的数据类型是double,所以这个联合的大小是double型对象的大小。
因为联合是一种特殊类,所以union的成员也是通过类成员访问操作符(.和->)访问,union中也可以包含构造函数和析构函数,成员变量和成员函数,也可以声明为public、private、protected。缺省情况下默认为public。总结一下联合的特点:
1. union可以定义自己的函数,包括构造函数和析构函数。
2. union支持public、private、protected权限。
3. union不能被继承,它不能有父类也不能有子类。
4. union中不能定义虚函数。
5. union中不能有静态数据成员和引用数据成员。
6. 如果一个类类型定义了构造函数、析构函数或拷贝赋值操作符,则它不能成员union的成员类型。
7. 不允许对union变量做初始化赋值,只能在程序中赋值。
8. 一个union变量只能赋予一个成员值,换句话说一个union变量的值就是union变量某一成员的值。
匿名联合
一种特殊的联合,匿名union 是没有名字的union,它后面也没有跟着对象定义。仅仅通知编译器它的成员变量共同享一个地址,而变量本身是直接引用的,不使用通常的点号运算符语法。
举例:
union
{
char cVal;
int iVal;
char *sVal;
double dVal;
} test;
上面这个union不是匿名union,因为它后面有对象定义。
匿名union的特点:
1. 匿名union 的数据成员可以在定义匿名union 的域中被直接访问。
2. 匿名union 不能有私有或保护的成员也不能定义成员函数。
3. 在全局域以及namespace中定义的匿名union只能声明为static。