共用体的用处

共用体的用处

注:带颜色的文本是转发者加到
一直不太了解CPP中共用体的作用,查了一下,下文是对共用体作用的总结。 

对于两个类似的结构体,只有某处是替换性的区别,则可以用共用体来实现一个结构体表示两类事物,例如:设有若干个人员的数据,其中有学生和老师。学生的数据中包含:姓名、号码、性别、职业、年级。教师的数据包括:姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。要求输入人员的数据,然后再输出。(一个学生一个教师)。 
本实例中,可以替换的是学生的年级与老师的职务,一个是int类型,一个是char数组,所以,可以使用共用体来进行处理。 
示例代码:
#include <iostream>
#include <string>
#include <iomanip>  //因为在输出流中使用了控制符setw
using namespace std;  //使用名字空间,将上面的保含的头文件打开,头文件是 <iostream>
struct{                //声明匿名的结构体
    int num;
    char name[10];
    char sex;
    char job;
    union P{              //声明共用体类型
    int grade;       //年级
    char position[10]; //职务
    }category;       //成员category为共用体变量
}person[2];         //定义共用体数组person(这种说法不对,与共用体没有任何关系),含两个元素(个人认为就是结构体类型变量)

                         //就是结构体变量数组,数组下标2就表示定义了两个结构体,可以放2个人的信息,结构体中所有元素被调用2次后                         //形成的2个元素的数组,每个元素又是 一个数组,这两个元素中的小元素数量相同,单元素的名称不完全相同,只有                        //   一个小元素不同,最后形成数组的数组。这里的数字2是创建结构体的变量个数,也就是创建登记人员信息的数                         //量若要输入89个人的信息,则person[89].所以说这里的89与共用体没关系。

     

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.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<<""<<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;
}
(如果一个结构体如果定义一个变量,不是变量数组的话,使用这个结构体时就只能输入一个人的信息。如果结构体定义一个变量数组的话,数组的个数就是结构体的个数,也就表示能够输入采集人员的数量,当然这些人员的信息字段都必须是相同的,如果有一个字段不同,可以通过上面的例子(使用一个共用体,共用体中的元素设计时就必须是包含着两个不同的名称作为共用体的成员元素,)可以构建两种不同的结构体,去输入两类人员的信息。如果还要增加一类人员是公务员职业,则就要设计3个结构体,在共用体中就要增加一个公务员对应的元素譬如“级别”这个成员:“jibie”,把jibie这个常量添加到共用体中,union P{              //声明共用体类型
    int grade;       //年级
    char position[10]; //职务
    }category;  )就变成union P{              //声明共用体类型
    int grade;       //年级
    char position[10]; //职务

  char jibie[10];  //级别
    }category;  

这样才能完成3类人员的信息输入和输出。


在此处,使用共用体将本来要使用两个结构体的代码,简化为之使用一个了,对于相似的类型,便利的时候要方便很多。 
关于共用体的性质还有很多,但感觉了解共用体后,共用体用处不是很大,而且会导致代码逻辑不太明显,降低了可读性,能不用就不用吧。
--------------------- 
作者:kevinzhan0417 
来源:CSDN 
原文:https://blog.csdn.net/kevinzhan0417/article/details/50592504 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/weixin_41632560/article/details/84846228