C語言是1972年由美國貝爾實驗室研製成功的,在當時算是高級語言,它的很多新特性都讓彙編程序員羨慕不已,就像今天的Go語言,剛出生就受到追捧。C語言也是”時髦“的語言,後來的很多軟件都用C語言開發,包括 Windows、Linux 等。 但是隨着計算機性能的飛速提高,硬件配置與幾十年前已有天壤之別,軟件規模也不斷增大,很多軟件的體積都超過 1G,例如 PhotoShop、Visual Studio 等,用C語言開發這些軟件就顯得非常吃力了,這時候C++就應運而生了。好今天我們來說一下C++共同體。
有時需要使幾種不同類型的變量存放到同一段內存單元中。例如,可把一個整型變量、一個字符型變量、一個雙精度型變量放在同一個地址開始的內存單元中。
以上3個變量在內存中佔的字節數不同,但都從同一地址開始存放。也就是使用覆蓋技術,幾個變量互相覆蓋。這種使幾個不同的變量共佔同一段內存的結構,稱爲共用體(union )類型的結構(有些書譯爲聯合)。
聲明共用體類型的一般形式爲:
union 共用體類型名{成員表列};
定義共用體變量的一般形式爲:
共用體類型名 共用體變量名;
當然也可在聲明共用體類型的同時定義共用體變量,也可沒有共用體類型名而直接定義共用體變量。例如可以看到,“共用體”與“結構體”的定義形式相似。但它們的含義是不同的。結構體變量所佔內存長度是各成員佔的內存長度之和。每個成員分別佔有其自己的內存單元。共用體變量所佔的內存長度等於最長的成員的長度。
共用體類型數據的特點
使用共用體變量的目的是希望用同一個內存段存放幾種不同類型的數據。但請注意: 在每一瞬時只能存放其中一種,而不是同時存放幾種。
能夠訪問的是共用體變量中最後一次被賦值的成員,在對一個新的成員賦值後原有的成員就失去作用。
共用體變量的地址和它的各成員的地址都是同一地址。
不能對共用體變量名賦值;不能企圖引用變量名來得到一個值;不能在定義共用體變量時對它初始化;不能用共用體變量名作爲函數參數。
設有若干個人員的數據,其中有學生和教師。學生的數據中包括: 姓名、號碼、性別、職業、年級。教師的數據包括: 姓名、號碼、性別、職業、職務。可以看出,學生和教師所包含的數據是不同的。
現要求把它們放在同一表格中,如果job項爲s(學生),則第5項爲grade(年級)。即Li是3年級的。如果job項是t(教師),則第5項爲position(職務)。Wang是prof(教授)。顯然對第5項可以用共用體來處理(將class和position放在同一段內存中)。要求輸入人員的數據,然後再輸出。爲簡化起見,只設兩個人(一個學生、一個教師)。
程序如下:
#include
#include
#include //因爲在輸出流中使用了控制符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>>person[i].category.grade; //若是學生則輸入年級
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<<" “<<person[i].sex <<” "
<<person[i].job<<setw(10)<<person[i].category.grade<<endl;
else cout<<person[i].num<<setw(6)<<person[i].name
<<" “<<person[i].sex <<” "<<person[i].job
<<setw(10)<<person[i].category.position<<endl;
}
return 0;
}
運行情況如下:
101 Li fs 3↙ (注意在輸入的字母f和s之間無空格)
102 Wang mt prof↙ (注意在輸入的字母m和t之間無空格)
No. Name sex job grade/position 101 Li f s 3 102 Wang m t prof
爲了使輸出結果上下對齊,在cout語句中用了setw控制符和插入空格。往往需要試驗多次。
共用體變量的訪問方式
不能引用共用體變量,而只能引用共用體變量中的成員。例如,下面的引用方式是正確的:
a.i (引用共用體變量中的整型成員i)
a.ch (引用共用體變量中的字符型成員ch)
a.f (引用共用體變量中的雙精度型成員d)
不能只引用共用體變量,例如
cout<<a;
是錯誤的,應該寫成
cout<<a.i;
或
cout<<a.ch;