定义:联合(union)是一种特殊的类。一个union对象可以有多个数据成员,但是任何时刻,只有一个成员可以有值。当将一个值赋给union对象的一个成员的时候,其他所有成员都变为未定义的
union U1
{
int n;
char s[11];
double d;
};
联合体的大小
1)大小足够容纳最宽的成员;2)大小能被其包含的所有基本数据类型的大小所整除
union U1
{
int n;
char s[11];
double d;
};
int _tmain(int argc, _TCHAR* argv[])
{
U1 u1;
// 对于U1联合体,s占11字节,n占4字节,d占8字节,因此其至少需1字节的空间。然而其实际大小并不是11,用运算符sizeof测试其大小为16。这是因为这里存在字节对齐的问题,11既不能被4整除,也不能被8整除。因此补充字节到16,这样就符合所有成员的自身对齐了
cout<<sizeof(u1)<<' '<<endl;
cout<<"u1各数据地址:
"<<&u1<<' '<<&u1.d<<' '<<&u1.s<<' '<<&u1.n<<endl;
return 0;
}
匿名联合
class MCDValue
{
public:
// 匿名联合作用域在外围对象,可直接使用外围对象访问联合成员变量
// 匿名联合不能存在私有成员或保护成员,不能有成员函数
union
{
std::string *pStr;
int num1;
std::wstring *pWstr;
double num2;
};
};
union判别式
class Token
{
public:
// 给union对象的某个数据成员赋值其他数据成员会变为未定义的
// 避免错误访问到其他成员,添加一个单独的对象跟踪
enum TokenKind {INT1, CHAR1, DBL1};
TokenKind tok;
union TokenValue
{
char cval;
int ival;
double dval;
}val;
};
联合体存储高低位
union Word
{
__int16 v16;
__int8 v8[2];
};
int _tmain(int argc, _TCHAR* argv[])
{
Word word;
word.v16 = 0x1122;
printf("word.v16 = %x
", word.v16);
printf("word.v8[0] = %x
", word.v8[0]);
printf("word.v8[1] = %x
", word.v8[1]);
return 0;
}
union成员限制
1)union不能作为基类使用,所以成员函数不能为虚函数。
2)union不能具有静态数据成员或引用成员
3)union自身可以有析构和构造,但不能具有定义了析构或构造的类成员
4)匿名联合不能存在私有成员或保护成员,不能有成员函数