union(共用聲明和共用一變數定義)

union(共用聲明和共用一變數定義)

本詞條是多義詞,共5個義項
更多義項 ▼ 收起列表 ▲

“聯合”是一種特殊的類,也是一種構造類型數據結構。在一個“聯合”內可以定義多種不同的數據類型, 一個被說明為該“聯合”類型的變數中,允許裝入該“聯合”所定義的任何一種數據,這些數據共享同一段記憶體,以達到節省空間的目的(還有一個節省空間的類型:位域)。 這是一個非常特殊的地方,也是聯合的特徵。另外,同struct一樣,聯合默認訪問許可權也是公有的,並且,也具有成員函式

基本介紹

  • 中文名:union
  • 性質:一種構造類型的數據結構
  • 釋義:共用體聲明和共用體變數定義
  • 功能:組合面域
關鍵字,運算符,命令,聯合與結構的區別,

關鍵字

1. 共用體聲明和共用體變數定義
共用體(參考“共用體”百科詞條)是一種特殊形式的變數,使用關鍵字union來定義
共用體(有些人也叫"聯合")聲明和共用體變數定義與結構體十分相似。其形式為:
union 共用體名
數據類型 成員名;
數據類型 成員名;
...
變數名;
共用體表示幾個變數共用一個記憶體位置,在不同的時間保存不同的數據類型和不同長度的變數。在union中,所有的共用體成員共用一個空間,並且同一時間只能儲存其中一個成員變數的值。
下例表示聲明一個共用體foo:
union foo{/*“共用”類型“FOO”*/
    int i;    /*“整數”類型“i”*/
    char c;   /*“字元”類型“c”*/
    double k;  /*“雙”精度類型“k”*/
};
再用已聲明的共用體可定義共用體變數。
例如用上面說明的共用體定義一個名為bar的共用體變數, 可寫成:
union foo bar;
在共用體變數bar中, 整型變數i和字元變數c共用同一記憶體位置。
當一個共用體被聲明時, 編譯程式自動地產生一個變數, 其長度為聯合中類型位元組數最多的變數的類型長度的整數倍。以上例而言,最大長度是double數據類型,所以foo的記憶體空間就是double型的長度。
union foo{/*“共用”類型“FOO”*/
    char s[10];    /*“字元”類型的數組“S”下面有“10”個元素*/
        int i;        /*“整數”類型i*/
};
在這個union中,foo的記憶體空間的長度為12,是int型的3倍,而並不是數組的長度10。若把int改為double,則foo的記憶體空間為16,是double型的兩倍。
它的記憶體大小與struct的類似,可以參考一下。
由於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的成員不可以為靜態、引用,如果是自定型態的話,該自定型態成員不可以有建構函式、解構函式或是複製指定運運算元。
2. 共用體和結構體的區別
共用體和結構體有下列區別:
1. 共用體和結構體都是由多個不同的數據類型成員組成, 但在任何同一時刻, 共用體只存放了一個被選中的成員, 而結構體的所有成員都存在。
2. 對於共用體的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於結構體的不同成員賦值是互不影響的。

運算符

資料庫 Translate-SQL 中 的運算符,將兩個或更多查詢的結果組合為單個結果集,該結果集包含聯合查詢中的所有查詢的全部行。這與使用聯接組合兩個表中的列不同。使用 UNION 組合兩個查詢的結果集的兩個基本規則是:
1 、 所有查詢中的列數和列的順序必須相同。
2 、 數據類型必須兼容。
例句:
select top 100 aa.keyno,aa.commtype from comminfo aa
union all
select bb.userno,bb.corpname from userinfo bb
將comminfo表和userinfo表中的欄位合成一個結果集(可能有重複數據,不過效率較高)
select top 100 aa.keyno,aa.commtype from comminfo aa
union
select bb.userno,bb.corpname from userinfo bb
將comminfo表和userinfo表中的欄位合成一個結果集(沒有有重複數據,效率較union all 低點)

命令

功能:組合面域或實體。 組合面域是兩個或多個現有面域的全部區域合併起來形成的。組合實體是兩個或多個現有實體的全部體積合併起來形成的。可合併無共同面積或體積的面域或實體

聯合與結構的區別

“聯合”與“結構”有一些相似之處。但兩者有本質上的不同。在結構中各成員有各自的記憶體空間, 一個結構變數的總長度是各成員長度之和(空結構除外,同時不考慮邊界調整)。而在“聯合”中,各成員共享一段記憶體空間, 一個聯合變數的長度等於各成員中最長的長度。應該說明的是, 這裡所謂的共享不是指把多個成員同時裝入一個聯合變數內, 而是指該聯合變數可被賦予任一成員值,但每次只能賦一種值, 賦入新值則衝去舊值。
下面舉一個例了來加深對聯合的理解。
例4:
#include <stdio.h>
 int main()
 {
     union number{ /*定義一個聯合*/
         int i;
         struct
         { /*在聯合中定義一個結構*/
             char first;
             char second;
         }half;
     }num;
 num.i=0x4241; /*聯合成員賦值*/
 printf("%c%c\n", num.half.first, num.half.second);
 num.half.first='a'; /*聯合中結構成員賦值*/
 num.half.second='b';
 printf("%x\n", num.i);
 getchar();
 }
輸出結果為:
AB
6261
從上例結果可以看出: 當給i賦值後, 其低八位0x41就是first的值,高八位0x42就是second的值; 當給first和second賦字元後, 這兩個字元的ASCII碼也將作為i 的低八位和高八位。

熱門詞條

聯絡我們