定義:
使用覆蓋技術,幾個變量相互覆蓋,從而使幾個不同變量共占同一段內存的結構,成為共同體類型的結構。
共同體的定義類似結構體,不過共同體的所有成員都在同一段內存中存放,起始地址一樣,並且同一時刻只能使用其中的一個成員變量。
聲明共用體的一般形式為:
代碼如下:
union 共用體類型名
{
成員列表
};
定義共用體變量的一般形式為:
共用體類型名 共用體變量名;
例如:
代碼如下:
union data{
int i;
char ch;
double d;
};
data a,b,c;
或者
代碼如下:
union{
int i;
char ch;
double d;
};
data a,b,c;
結構體變量所占長度是各成員占的內存長度之和。每個成員分別占有自己的內存單元。共用體變量所占的內存長度等於最長的成員的長度。
共用體的使用
1.不能應用共用體變量,而只能引用共用體變量中的成員。
例如:
代碼如下:
cout<<a.i;
cout<<a.ch;
2.使用共用體變量的目的是希望通過統一內存段存放幾種不同類型的數據。
但是要注意,每一瞬間只能存放一種,而不是存放集中。並且,如果對新的成員變量的話,原來的成員變量的值就被覆蓋了。
代碼如下:
#include<iostream>
using namespace std;
int main(){
union data{
char a;
char b;
};
data qianshou;
qianshou.a='q';
cout<<qianshou.a<<endl;
qianshou.b='m';
cout<<qianshou.a<<endl;
return 0;
}
後來,我們對共用體中的成員b進行了賦值,結果我們輸出的是成員a,輸出的是b的值,所以證明它們是公用地址的。
3.不能對共用體變量名賦值,不能企圖引用變量名來得到一個值;不能在定義共用體變量時對它初始化,不能用共用體變量名作為函數參數。
一個共同體的實例:
設有若干個人員的數據,其中有學生和老師。學生的數據包括:姓名,編號,性別,職業,年級。老師的數據包括:姓名,編號,性別,職業,職務。可以看出,學生和老師所包含的數據是不同的。先要求把他們放在同一個表格中:
要求設計程序輸入人員信息然後輸出。
如果把每個人都看作一個結構體變量的話,可以看出老師和學生的前4個成員變量是一樣的,並且第五個成員變量可能是class或者position,當第四個成員變量是s的時候,第五個成員變量就是class;當第四個成員變量是t的時候,第五個成員變量就是position。
代碼如下:
#include<iostream>
#include<string>
using namespace std;
int main(){
struct{
string name;
string num;
char sex;
char job;
union{
char grade[5];
char position[5];
}p;//定義了一個共同體變量
}person[2];//定義了一個結構體數組變量
int i=0;
cout<<"name\tnum\tsex\tjob\tclass/position"<<endl;
for(;i<2;i++){
cin>>person[i].name>>person[i].num>>person[i].sex>>person[i].job;
if(person[i].job=='s')cin>>person[i].p.grade;
else cin>>person[i].p.position;
}
i=0;
cout<<"===========show data==========="<<endl;
for(;i<2;i++){
cout<<person[i].name<<"\t";
cout<<person[i].num<<"\t";
cout<<person[i].sex<<"\t";
cout<<person[i].job<<"\t";
if(person[i].job=='s')cout<<person[i].p.grade<<endl;
else cout<<person[i].p.position<<endl;
}
cout<<endl;
return 0;
}