- 使用共用体变量的目的是希望用同一个内存段存放几种不同类型的数据。但请注意: 在每一瞬时只能存放其中一种,而不是同时存放几种。
- 能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。
- 共用体变量的地址和它的各成员的地址都是同一地址。
- 不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。
例7.7 设有若干个人员的数据,其中有学生和教师。学生的数据中包括: 姓名、号码、性别、职业、年级。教师的数据包括: 姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。
现要求把它们放在同一表格中,如果job项为s(学生),则第5项为grade(年级)。即Li是3年级的。如果job项是t(教师),则第5项为position(职务)。Wang是prof(教授)。显然对第5项可以用共用体来处理(将class和position放在同一段内存中)。要求输入人员的数据,然后再输出。为简化起见,只设两个人(一个学生、一个教师)。
程序如下:
#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>>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控制符和插入空格。往往需要试验多次。