Union


union是一種特殊的類別,使用關鍵字union來定義,union維護足夠的空間來置放多個資料成員中的「一種」,而不是為每一個資料成員配置空間, 在union中所有的資料成員共用一個空間,同時間只能儲存其中一個成員的資料,一個定義union的例子如下:
union StateMachine {
    char character;
    int number;
    char *str;
    double exp;
};


一個union只配置一個足夠大的空間以來容納最大長度的資料成員,以上例而言,最大長度是double型態,所以StateMachine的記憶體空間 就是double型態的長度,union的成員預設為public,也可以宣告為protected或private,當中可以定義建構函式、解構函式與 成員函式,例如:

#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;
}
};

int main() {
StateMachine machine(1);

cout << machine.number << endl;

return 0;
}

執行結果:
1

由於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的成員不可以為靜態、參考,如果是自訂型態的話,該自訂型態成員不可以有建構函式、解構函式或是複製指定運算子。