共用體(union)
一、 基礎概念
有時需要使幾種不同類型的變量存放在同一段內存單元中。雖然在同一段內存中不同數據類型所占字節數不同,但都從同一地址開始存放,也就是使用了覆蓋技術,幾個變量互相覆蓋。這種使幾個不同的變量共占一段內存的結構,稱為共同體類型的結構(也稱為聯合類型)。
二、 聲明共用體類型的一般形式:
union 共用體類型名
{
成員表列
};
定義共用體變量的一般形式:
共用體類型名 共用體變量名;
也可以在聲明共用體類型的同時定義共用體變量,也可以沒有共用體類型名直接定義共用體變量。
union data
{
int i;
char ch;
double d;
}a,b,c;
三、 “共用體”與“結構體”區別
結構體變量所占內存長度是各成員占的內存長度之和。每個成員分別占有其自己的內存單元。共用體變量所占的內存長度等於最長的成員的長度。
四、 對共用體變量的訪問方式
不能直接引用共用體變量,只能引用共用體變量中的成員。
a.i; a.ch a.f
不能引用共用體變量:cout<<a;
五、 共用體類型數據的特點
1、 使用共用體變量的目的是希望在同一個內存段存放幾種不同類型的數據。注意:在每一瞬時只能存放其中一種,而不是同時存放多種。換句話說,每一瞬時只有一個成員起作用,其他成員不起作用。
2、 能夠訪問的是共用體變量中最後一次被賦值的成員,在對一個新的成員賦值後原有的成員就失去作用。因此在引用共用體變量時應注意當前在共用體變量中起作用的是哪個成員。
3、 共同體變量的地址和它的各成員的地址相同,為同一個地址。
4、 不能對共用體變量名賦值;不能引用變量名來得到一個值;不能在定義共用體變量時對它初始化;不能用共用體變量名作為函數參數。
六、共用體應用舉例
設有若干個人員的數據,其中有學生和老師。學生的數據中包含:姓名、號碼、性別、職業、年級。教師的數據包括:姓名、號碼、性別、職業、職務。可以看出,學生和教師所包含的數據是不同的。要求輸入人緣的數據,然後再輸出。(一個學生一個教師)。
程序如下:
/*
* test4.cpp
*
* Created on: 2012-4-10
* Author: David
*/
#include <iostream>
#include <string>
#include <iomanip> //因為在輸出流中使用了控制符setw
using namespace std;
struct //聲明匿名的結構體
{
int num;
char name[10];
char sex;
char job;
union P //聲明共用體類型
{
int grade; //年級
char position[10]; //職務
}category; //成員category為共用體變量
}person[2]; //定義共用體數組person,含兩個元素(個人認為就是結構體類型變量)
int main()
{
int i ;
for(i=0;i<2;i++)
{
cin>>person[i].num>>person[i].name>>person[i].sex>>person[i].job;
if(person[i].job=="s")
{
cin>>perosn[i].category.position;
}else if(person[i].job=="t")
{
cin>>person[i].category.position;
}
cout<<endl<<"No.Name sex job grade/position"<<endl;
}
for(i=0;i<2;i++)
{
if(person[i].job=="s")
{
cout<<person[i].num<<setw(6)<<person[i].name<<""<<perosn[i].sex<<""<<person[i].job<<setw(10)<<perosn[i].category.grade<<endl;
}else{
cout<<perosn[i].num<<setw(6)<<person[i].name<<""<<person[i].sex<<" "<<person[i].job<<setw(10)<<person[i].category.position<<endl;
}
}
return 0;
}