定義:聯合(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)<<'\t'<<endl;
cout<<"u1各數據地址:\n"<<&u1<<'\t'<<&u1.d<<'\t'<<&u1.s<<'\t'<<&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 \n", word.v16);
printf("word.v8[0] = %x \n", word.v8[0]);
printf("word.v8[1] = %x \n", word.v8[1]);
return 0;
}
union成員限制
1)union不能作為基類使用,所以成員函數不能為虛函數。
2)union不能具有靜態數據成員或引用成員
3)union自身可以有析構和構造,但不能具有定義了析構或構造的類成員
4)匿名聯合不能存在私有成員或保護成員,不能有成員函數