關鍵字
1. 共用體聲明和共用體變量定義
共用體(參考“共用體”百科詞條)是一種特殊形式的變量,使用關鍵字union來定義
共用體(有些人也叫"聯合")聲明和共用體變量定義與結構體十分相似。其形式為:
union?共用體名{
數據類型?成員名;
數據類型 成員名;
...
}?變量名;
共用體表示幾個變量共用一個內存位置,在不同的時間保存不同的數據類型和不同長度的變量。在union中,所有的共用體成員共用一個空間,并且同一時間只能儲存其中一個成員變量的值。
下例表示聲明一個共用體foo:
union foo{
int i;
char c;
double k;
};
再用已聲明的共用體可定義共用體變量。
例如用上面說明的共用體定義一個名為bar的共用體變量, 可寫成:
union foo bar;
在共用體變量bar中,?整型變量i和字符變量c共用同一內存位置。
當一個共用體被聲明時,?編譯程序自動地產生一個變量, 其長度為聯合中最大的變量長度的整數倍。以上例而言,最大長度是double數據類型,所以foo的內存空間就是double型的長度。
union foo
{
char s[10];
int i;
};
在這個union中,foo的內存空間的長度為12,是int型的3倍,而并不是數組的長度10。若把int改為double,則foo的內存空間為16,是double型的兩倍。
它的內存大小與struct的類似,可以參考一下。
由于union的數據成員共用一個內存空間,所以必須存取正確的成員才能正確的讀取變量值,可以使用一個額外的變數或列舉型態來記錄最后一次使用空間的是哪個成員,例如:
#include <iostream>
using namespace std;
union StateMachine {
public:
char character;
int number;
char *str;
StateMachine(char c) {
character = c;
}
StateMachine(int n) {
number = n;
}
StateMachine(char* s) {
str = s;
}
};
enum State {character, number, str};
int main() {
State state = character;
StateMachine machine('J');
...
if(state == character)
cout << machine.character << endl;
...
return 0;
}
另外要注意的是,union的成員不可以為靜態、引用,如果是自訂型態的話,該自訂型態成員不可以有建構函式、解構函式或是復制指定運算子。
2. 共用體和結構體的區別
共用體和結構體有下列區別:
1.?共用體和結構體都是由多個不同的數據類型成員組成, 但在任何同一時刻, 共用體只存放了一個被選中的成員, 而結構體的所有成員都存在。
2. 對于共用體的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對于結構體的不同成員賦值是互不影響的。