[C/C++] Union型別 (討論在C&C++中的差異)

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]

http://www.zentut.com/c-tutorial/c-union/