1. 程式人生 > 其它 >C++ 共用體

C++ 共用體

  共用體(union)是一種資料格式,它能夠儲存不同的資料型別,但只能同時儲存其中的一種型別。也就是說,結構可以同時儲存int,long和double,共用體只能儲存int,long或double。共用體的句法與結構相似,但含義不同。

  union onr4all

  {

    int int_val;

    long long_val;

    double double_val;

  };

  可以使用one4all變數來儲存int、long或double,條件是在不同的時間進行:

  one4all pail;

  pail.int_val = 15;

  cout << pail.int_val;

  pail.double._val = 1.38;

  cout << pail.double_val;

  因此,pail有時可以是int變數,而有時又可以是double變數。成員名稱表示了變數的容量。由於共用體每次只能儲存一個值,因此它必須有足夠的空間來儲存最大的成員,所以,共用體的程度為其最大成員的長度。

  共用體的用途之一是,當資料項使用兩種或更多的格式(但不會同時使用)時,可節省空間。例如,假設管理一個小商品目錄,其中有一些商品的ID為整數,而另一些的ID為字串。在這種情況下,可以這樣做:

  struct widget

  {

    char brand[20];

    int type;

    union id

  {

    long id_num;

    char id_char[20];

  }id_val;

  };

  ...

  widget prize;

  ...

  if (prize.type == 1)

    cin >> prize.id_val.id_num;

  else

    cin >> prize.id_val.id_char;

  匿名共用體(anonymous union)沒有名稱,其成員將成為位於想用地址處的變數。顯然,每次只有一個成員是當前的成員:

  struct widget

  {

    char band[20];

    int type;

    union

    {

      long id_num;

      char id_char[10];

    };

  };

  ...

  widget prize;

  ...

  if (prize.type == 1)

    cin >> prize.id_num;

  else

    cin >> prize.id_num;

  由於共用體是匿名的,因此id_num和id_char被視為peize的兩個成員,它們的地址相同,所以不需要中間識別符號id_val。程式設計師負責確定當前哪個成員是活動的。

  共用體常用於(但並非只能用於)節省記憶體。當前,系統的記憶體多達數GB的甚至數TB,好像沒有必要節省記憶體,但並非所有的C++程式設計師都是為這樣的系統編寫的。C++還用於嵌入式系統程式設計,如控制烤箱,MP3播放器或火星漫步者的處理器。對這些應用程式來說,記憶體可能非常寶貴。另外,共用體常用於作業系統資料結構或硬體資料結構。