1. 共用體聲明和共用體變量定義
共用體(參考「共用體」百科詞條)是一種特殊形式的變量,使用
關鍵字union來定義
數據類型 成員名;
...
共用體表示幾個
變量共用一個內存位置,在不一樣的時間保存不一樣的
數據類型和不一樣長度的變量。在union中,全部的
共用體成員共用一個空間,而且同一時間只能儲存其中一個
成員變量的值。
union foo{
int i;
char c;
double k;
};
例如用上面說明的
共用體定義一個名爲bar的共用體
變量, 可寫成:
union foo bar;
當一個
共用體被聲明時,
編譯程序自動地產生一個
變量, 其長度爲聯合中最大的變量長度的整數倍。以上例而言,最大長度是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. 對於
共用體的不一樣成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於
結構體的不一樣成員賦值是互不影響的。