大家好
欢迎回来继续学习
C++语言程序设计
这一节我们来学习联合体
联合体虽然在程序中
不是很常用
但是它也是非常有用的一种
数据结构
看起来它的定义与类
与结构体都很像
但是一个根本上的差别
在于联合体的目的
是存储空间的共用
现在我们就来看看
联合体如何定义
那么联合体要用union
这个关键词开头
后面跟着联合体的名称
那么里面我们看到
也是分成公有成员 保护成员
私有成员
我们也可以定义它的成员
但是这些成员
它不是同时存在
同时起作用的
它必须不同时存在
什么意思呢
它实际说是所有的成员
共用相同的内存单元
所以任何两个成员
都不会同时有效
比如说我们定义一个成绩联合体
我们知道
一门课的成绩肯定
它只能选择一种形式
或者是百分制的
或者是分等级的
或者是通过不通过 对吧
所以一个人在一门课
获得了成绩
它只会是一种
这个时候呢
我们就可以像这样来定义一个
成绩联合体
大家看
我们可以这样来定义
这个成绩联合体
这里面有三个成员
一个是等级grade
一个是是否通过pass
一个是百分制成绩percent
这三个成员
它们的类型也不同
那由于某一门课
某一个人的成绩
只可能选择其中的一种
所以我们就可以把它放在
这个联合体里面
我们看这张图
实际上这个Mark联合体对象呢
它将占用比如说四个字节
如果int在这个系统中
是四个字节的话
它就将占用四个字节
为什么呢
因为int占的字节数最多
那么字符型和布尔型
都只占单个字节
它们共用存储空间呢
就按照最多字节数的那个成员
来分配空间
也就是说
如果你将数据作为grade存入了
作为这个等级成绩存入了
将来你只能作为等级成绩取出来
如果你作为通过与否
以布尔值存入了
将来你只能作为布尔值取出来
如果你曾经存入过等级分
或者是通过与不通过的这个标记
然后你往这个对象中
再次存入一个百分制成绩的话
原来存入的数据就会被冲掉
因为它是共用存储空间的
在程序中呢
我们还可以定义无名联合体
我们看看这个例子里面呢
就是定义了一个无名联合体
大家看
这只用了一个
union的这个关键字
而没有联合体的名字
像这样定义以后
只是规定了变量i
和变量f它们要共用内存空间
在程序中使用i
使用f的时候
就像使用普通变量一样
直接使用它们的变量名就可以了
但是我们要注意
如果你给i复了制
紧接着又给f复制的话
在i里面复的制就被冲掉了
因为它们是
共用的同样的存储空间
下面呢
我们就来看一个
使用联合体的例题
在这个例子中呢
我们用了一个联合体
我们要保存成绩
成绩有三种
等级制的
还有通过不通过的
和百分制的成绩
但是同一门课的同一个学生
他肯定只能用一种积分模式
得到一个成绩
所以呢
我们把这三种成绩
放到一个联合体里面
因为它在同一个时刻
不会都起作用了
只会有一个起作用
然后另外呢
就是成绩模式
我们设了一个枚举类型
来表示成绩模式
一共有这样三种模式
于是它就需要三种构造函数
分别按不同的模式去初始化
它不同类型的联合体成员
所以这里有三种构造函数
那么显示函数呢
也是有三种
这个类的显示函数也有三种
它要按照不同的模式
分别显示不同的成绩
那我们看在主函数中
现在构造了三门课程的成绩对象
先是课程名
然后后面给出了什么呢
给出了它的成绩
这个是B 这个是通过
这个是85分
构造了这样三门课程
接下来用这个show函数
去显示三门课程的成绩
所以通过这个呢
我们就体会到
在什么情况下会用到联合体
就是三种成员类型
它不会同时起作用
每个时刻只有一个起作用
那么这时候
就可以让它们共用存储空间
不仅仅是节省了存储空间
还会避免冗余
避免这种错误
比如说我给一个人的成绩
既给了一个B
又给了一个85分
那这就不合适了
他只能要一种成绩
你要用联合体呢
你没办法给他两种成绩
给他的就是一种成绩