發新話題

C++ Gossip - 物件基礎《封裝的進階議題》Union

C++ Gossip - 物件基礎《封裝的進階議題》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的成員不可以為靜態、參考,如果是自訂型態的話,該自訂型態成員不可以有建構函式、解構函式或是複製指定運算子。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。