Union是一種將不同data types儲存在同一個記憶體空間的特殊自訂型別
Union是一種將不同data types儲存在同一個記憶體空間的特殊自訂型別,union一次只會儲存一個變數資料。
換句話說,所有在union宣告的變數會共享同一個記憶體空間,而且會已宣告的變數型態size最大的變數空間作為記憶體空間。
舉一個簡單的例子:
union unionType
{
char a[2];
short b;
};
int main(void)
{
union unionType u;
u.b=20;
printf("sizeof=%d u.b=%d, u.a[1]=%d, u.a[0]=%d\n", sizeof(u), u.b, u.a[1], u.a[0]);
}
輸出結果:sizeof=2 u.b=20, u.a[1]=0, u.a[0]=20
在上面的程式範例中,a[0]為低位元組,a[1]則為高位元組,我們可以發現a, b共享同一個記憶體資料。
接下來我們要區分一下C與C++在union上的差異:
C
union Data {
int a;
double b;
};
int main(){
union Data udata;
udata.a = 1;
udata.b = 0.5;
printf("%d\t%f\n", udata.a, udata.b);
return 0;
}
C++
union Data {
int a;
double b;
Data(){
a = 1;
b = 0.5;
}
};
int main(){
Data udata;
cout << udata.a << "\t" << udata.b << endl;
return 0;
}
在C++當中,union是類似struct與class的資料結構,使用上也大體相近,所以不論是建構函式、解構函式與 成員函式都是可以定義的。而且不需要加上union在宣告變數的型態前面。但在使用上要注意的是union的member不可以為static、refrence,如果是自訂型態的話,該自訂型態成員不可以有建構函式、解構函式或是複製指定運算子。
在C語言中,union的使用也是類似C的struct,所以在宣告變數的時候必須注意要加上union。
如果想要省略每次宣告變數都必須加上union,則可以利用typedef的方式,這樣宣告起來就像C++的方式了。
typedef union Data {
int a;
double b;
} Data;
int main(){
Data udata;
udata.a = 1;
udata.b = 0.5;
printf("%d\t%f\n", udata.a, udata.b);
return 0;
}
[Note] C union有兩種初始化的方式:
1) initialize a union to another union with the same type.
2) initialize a union by initializing the first member of a union.
typedef union {
char ch;
float f;
} Data;
int main()
{
Data d;
d.ch = 'A';
data d2 = d; // initialize one union to another
data d3 = {'B'}; // initialize first member of union
printf("%c, %c, %c\n", d.ch, d2.ch, d3.ch);
return 0;
}
[Reference]