由于教程上的看的还是不太懂,以下是自己总结的
共用体(union)又称联合体,特点是
①一个共用体之下有多个变量,
②且同时只能存在一个,
③且后面进行赋值的会覆盖前面的,
④且只能使用int、char、double三种变量,可以使用多种变量,任何 int(包括 char),任何浮点类型,(float,double,long double),以及指针union,struct,以及 以上类型的 数组 作为他的成员。但必须让用户自己写一个constructor否则无法正常生成这个union的对象。
⑤且共用同一块内存(这也是后面会覆盖前面的原因),
⑥形式类似结构
标准格式为:
union 共用体名 { int 变量名1; char 变良名2; double 变量名3; }; 共用体名 使用该共用体的共用体变量名; <span style="white-space:pre"> </span>共用体变量名.共用体内其中一个类型的变量名 = 值; //给共用体赋值
上代码:
#include<iostream> using namespace std; int main() { union abc //定义共用体abc { int a; char b; double c; }; abc apple; //声明apple共用体 apple.b = 'a'; //初始化apple共用体char b的值为字符串a cout << apple.b << endl; apple.a = 10; //覆盖apple共用体的内存,用int a的值取代char b值 cout << apple.a << endl; system("pause"); return 0; }
注意:(根据实践总结,欢迎指正)
①根据实际测试,char类型不能用字符串(即像char b[10];这样在编译的时候会出问题);
②只能用int、char、double,其他类型不可以;
③定义和声明的形式,类似结构;
④共用体只能储存一个字符,如果储存多个字符,会出问题,例如之后的输入被跳过(因为存储空间溢出);
⑤共用体虽然可以变换为三种形式,但一次只能显示其中一种,如果想输入另外一种,那么前一种就会被覆盖(即再也调用不出来,就算调用,也调用的是错误的);
⑥共用体可以用在结构之中,如代码:
#include<iostream> #include<string> using namespace std; struct abc //定义结构abc { string a; //结构的第一个成员为string a union //结构的第二个成员为共用体,具体哪个需要看声明和初始化 { int b; //共用体的第一个成员为int格式 double c; //共用体的第二个成员为double格式 }; }; int main() { abc gtt = { "数值" }; //声明gtt结构, 采用abc结构的形式,并初始化第一个成员的值为“数值” gtt.b = 1; //初始化gtt结构的第二个成员,并且第二个成员采用共用体的第一个成员int类型 cout << gtt.a << endl; //输出结构的第一个成员 cout << gtt.b << endl; //输出结构的第二个成员(且格式为共用体第一个成员的类型) gtt.c = 1.11; //覆盖gtt结构的第二个成员的值,并且采用的格式为共用体第二个成员的double类型 cout << gtt.c << endl; //输出结构第二个成员的值(且格式为共用体第二个成员的类型) system("pause"); return 0; }
输出结果为:
数值 1 1.11
我们可以从代码中看到,采用共用体时,共用体不同的成员(类型)需要使用不同的变量名,然后在初始化时,使用 结构名.共用体成员变量名 这种形式进行初始化,类似使用结构时的 结构名.结构成员变量名 这种形式。
(注:这次在union 后面直接是大括号,没有名字,使用的是匿名共用体的形式,和共用比相比,在引用的时候,可以不用写共用体的名,且匿名共用体的两个成员,认为是结构的两个成员——虽然同时只能存在一个)