(五十三)共用体

由于教程上的看的还是不太懂,以下是自己总结的

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

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值