由于教程上的看的还是不太懂,以下是自己总结的
共用体(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 后面直接是大括号,没有名字,使用的是匿名共用体的形式,和共用比相比,在引用的时候,可以不用写共用体的名,且匿名共用体的两个成员,认为是结构的两个成员——虽然同时只能存在一个)