C++ 共用體
共用體(union)是一種資料格式,它能夠儲存不同的資料型別,但只能同時儲存其中的一種型別。也就是說,結構可以同時儲存int,long和double,共用體只能儲存int,long或double。共用體的句法與結構相似,但含義不同。
union onr4all
{
int int_val;
long long_val;
double double_val;
};
可以使用one4all變數來儲存int、long或double,條件是在不同的時間進行:
one4all pail;
pail.int_val = 15;
cout << pail.int_val;
pail.double._val = 1.38;
cout << pail.double_val;
因此,pail有時可以是int變數,而有時又可以是double變數。成員名稱表示了變數的容量。由於共用體每次只能儲存一個值,因此它必須有足夠的空間來儲存最大的成員,所以,共用體的程度為其最大成員的長度。
共用體的用途之一是,當資料項使用兩種或更多的格式(但不會同時使用)時,可節省空間。例如,假設管理一個小商品目錄,其中有一些商品的ID為整數,而另一些的ID為字串。在這種情況下,可以這樣做:
struct widget
{
char brand[20];
int type;
union id
{
long id_num;
char id_char[20];
}id_val;
};
...
widget prize;
...
if (prize.type == 1)
cin >> prize.id_val.id_num;
else
cin >> prize.id_val.id_char;
匿名共用體(anonymous union)沒有名稱,其成員將成為位於想用地址處的變數。顯然,每次只有一個成員是當前的成員:
struct widget
{
char band[20];
int type;
union
{
long id_num;
char id_char[10];
};
};
...
widget prize;
...
if (prize.type == 1)
cin >> prize.id_num;
else
cin >> prize.id_num;
由於共用體是匿名的,因此id_num和id_char被視為peize的兩個成員,它們的地址相同,所以不需要中間識別符號id_val。程式設計師負責確定當前哪個成員是活動的。
共用體常用於(但並非只能用於)節省記憶體。當前,系統的記憶體多達數GB的甚至數TB,好像沒有必要節省記憶體,但並非所有的C++程式設計師都是為這樣的系統編寫的。C++還用於嵌入式系統程式設計,如控制烤箱,MP3播放器或火星漫步者的處理器。對這些應用程式來說,記憶體可能非常寶貴。另外,共用體常用於作業系統資料結構或硬體資料結構。