当前课程知识点:C++语言程序设计基础 > 第4章 类与对象 > 结构体与联合体 > 联合体(例4-8)
声明形式
union 联合体名称 { 公有成员 protected: 保护型成员 private: 私有成员 };
特点
成员共用同一组内存单元
任何两个成员不会同时有效
联合体的内存分配
举例说明:
union Mark { //表示成绩的联合体 char grade; //等级制的成绩 bool pass; //只记是否通过课程的成绩 int percent; //百分制的成绩 }; [object Object]
无名联合
例:
union { int i; float f; } 在程序中可以这样使用: i = 10; f = 2.2;
例4-8使用联合体保存成绩信息,并且输出。
#include <iostream> using namespace std; class ExamInfo { private: string name; //课程名称 enum { GRADE, PASS, PERCENTAGE } mode;//计分方式 union { char grade; //等级制的成绩 bool pass; //只记是否通过课程的成绩 int percent; //百分制的成绩 }; public: //三种构造函数,分别用等级、是否通过和百分初始化 ExamInfo(string name, char grade) : name(name), mode(GRADE), grade(grade) { } ExamInfo(string name, bool pass) : name(name), mode(PASS), pass(pass) { } ExamInfo(string name, int percent) : name(name), mode(PERCENTAGE), percent(percent) { } void show(); } void ExamInfo::show() { cout << name << ": "; switch (mode) { case GRADE: cout << grade; break; case PASS: cout << (pass ? "PASS" : "FAIL"); break; case PERCENTAGE: cout << percent; break; } cout << endl; } int main() { ExamInfo course1("English", 'B'); ExamInfo course2("Calculus", true); ExamInfo course3("C++ Programming", 85); course1.show(); course2.show(); course3.show(); return 0; } 运行结果: English: B Calculus: PASS C++ Programming: 85
大家好
欢迎回来继续学习
C++语言程序设计
这一节我们来学习联合体
联合体虽然在程序中
不是很常用
但是它也是非常有用的一种
数据结构
看起来它的定义与类
与结构体都很像
但是一个根本上的差别
在于联合体的目的
是存储空间的共用
现在我们就来看看
联合体如何定义
那么联合体要用union
这个关键词开头
后面跟着联合体的名称
那么里面我们看到
也是分成公有成员 保护成员
私有成员
我们也可以定义它的成员
但是这些成员
它不是同时存在
同时起作用的
它必须不同时存在
什么意思呢
它实际说是所有的成员
共用相同的内存单元
所以任何两个成员
都不会同时有效
比如说我们定义一个成绩联合体
我们知道
一门课的成绩肯定
它只能选择一种形式
或者是百分制的
或者是分等级的
或者是通过不通过 对吧
所以一个人在一门课
获得了成绩
它只会是一种
这个时候呢
我们就可以像这样来定义一个
成绩联合体
大家看
我们可以这样来定义
这个成绩联合体
这里面有三个成员
一个是等级grade
一个是是否通过pass
一个是百分制成绩percent
这三个成员
它们的类型也不同
那由于某一门课
某一个人的成绩
只可能选择其中的一种
所以我们就可以把它放在
这个联合体里面
我们看这张图
实际上这个Mark联合体对象呢
它将占用比如说四个字节
如果int在这个系统中
是四个字节的话
它就将占用四个字节
为什么呢
因为int占的字节数最多
那么字符型和布尔型
都只占单个字节
它们共用存储空间呢
就按照最多字节数的那个成员
来分配空间
也就是说
如果你将数据作为grade存入了
作为这个等级成绩存入了
将来你只能作为等级成绩取出来
如果你作为通过与否
以布尔值存入了
将来你只能作为布尔值取出来
如果你曾经存入过等级分
或者是通过与不通过的这个标记
然后你往这个对象中
再次存入一个百分制成绩的话
原来存入的数据就会被冲掉
因为它是共用存储空间的
在程序中呢
我们还可以定义无名联合体
我们看看这个例子里面呢
就是定义了一个无名联合体
大家看
这只用了一个
union的这个关键字
而没有联合体的名字
像这样定义以后
只是规定了变量i
和变量f它们要共用内存空间
在程序中使用i
使用f的时候
就像使用普通变量一样
直接使用它们的变量名就可以了
但是我们要注意
如果你给i复了制
紧接着又给f复制的话
在i里面复的制就被冲掉了
因为它们是
共用的同样的存储空间
下面呢
我们就来看一个
使用联合体的例题
在这个例子中呢
我们用了一个联合体
我们要保存成绩
成绩有三种
等级制的
还有通过不通过的
和百分制的成绩
但是同一门课的同一个学生
他肯定只能用一种积分模式
得到一个成绩
所以呢
我们把这三种成绩
放到一个联合体里面
因为它在同一个时刻
不会都起作用了
只会有一个起作用
然后另外呢
就是成绩模式
我们设了一个枚举类型
来表示成绩模式
一共有这样三种模式
于是它就需要三种构造函数
分别按不同的模式去初始化
它不同类型的联合体成员
所以这里有三种构造函数
那么显示函数呢
也是有三种
这个类的显示函数也有三种
它要按照不同的模式
分别显示不同的成绩
那我们看在主函数中
现在构造了三门课程的成绩对象
先是课程名
然后后面给出了什么呢
给出了它的成绩
这个是B 这个是通过
这个是85分
构造了这样三门课程
接下来用这个show函数
去显示三门课程的成绩
所以通过这个呢
我们就体会到
在什么情况下会用到联合体
就是三种成员类型
它不会同时起作用
每个时刻只有一个起作用
那么这时候
就可以让它们共用存储空间
不仅仅是节省了存储空间
还会避免冗余
避免这种错误
比如说我给一个人的成绩
既给了一个B
又给了一个85分
那这就不合适了
他只能要一种成绩
你要用联合体呢
你没办法给他两种成绩
给他的就是一种成绩
-导学
--第1章导学
-计算机系统简介
--计算机系统简介
--计算机系统简介 测试题
-计算机语言和程序设计方法的发展
--计算机语言和程序设计方法的发展 测试题
-面向对象的基本概念
--面向对象的基本概念 测试题
-程序的开发过程
--程序的开发过程
--程序的开发过程 测试题
-信息的表示和储存
--计算机的数字系统
--数据的编码表示
--信息的表示和储存 测试题
-实验指导
-导学
--第二章导学
-C++语言概述
--C++语言概述 测试题
-基本数据类型、常量、变量
--程序举例
--基本数据类型、常量、变量 测试题
-运算与表达式
--运算与表达式 测试题
-实验二:简单程序设计(上)
-数据的输入和输出
--数据的输入和输出
--数据的输入和输出 测试题
-选择结构
--if语句
--switch语句
--选择结构 测试题
-循环结构
--for语句
--循环结构 测试题
-自定义类型
--自定义类型
--自定义类型
-第2章小结
--第二章小结
-实验二:C++简单程序设计(下)
-导学
--导学
-函数定义
--函数定义
--函数定义 测试题
-函数调用
--例3-2
--例3-3
--例3-4
--例3-5
--例3-6
--函数调用 测试题
-嵌套与递归
--例3-9
--例3-10
--嵌套与递归 测试题
-函数的参数传递
--函数的参数传递
--函数的参数传递 测试题
-引用类型
--引用类型 测试题
-含有可变参数的函数
--含有可变参数的函数 测试题
-内联函数
--内联函数 测试题
-constexpr函数
--CONSTEXPR函数课后习题
-带默认参数值的函数
--带默认参数值的函数 测试题
-函数重载
--函数重载 测试题
-C++系统函数
--C++系统函数习题
-第3章小结
--第三章小结
-实验三(上)函数的应用
-实验三(下)函数的应用
-导学
--导学
-面向对象程序的基本特点
--面向对象程序的基本特点 测试题
-类和对象
--类和对象的定义
--类和对象 测试题
-构造函数
--构造函数基本概念
--委托构造函数
--复制构造函数
--构造函数 测试题
-析构函数
--析构函数
--析构函数 测试题
-类的组合
--类的组合
--类的组合程序举例
--前向引用声明
--类的组合 测试题
-UML简介
--UML简介
--UML简介课后习题
-结构体与联合体
--结构体与联合体 测试题
-枚举类
--枚举类
--枚举类 测试题
-第4章小结
--第四章小结
-实验四(上)
--实验四(上)
-实验四(下)
--实验四(下)
-导学
--导学
-标识符的作用域与可见性
--标识符的作用域与可见性 测试题
-对象的生存期
--对象的生存期
--对象的生存期 测试题
-类的静态成员
--类的静态成员 测试题
-类的友元
--类的友元 测试题
-共享数据的保护
--共享数据的保护 测试题
-多文件结构和预编译命令
--多文件结构和预编译命令 测试题
-第5章小结
--小结
-实验五
--实验五
-导学
--导学
-数组的定义与初始化
--数组的定义与使用
--一维数组应用举例
--数组的定义与初始化 测试题
-数组作为函数的参数
--数组作为函数的参数 测试题
-对象数组
--对象数组
--对象数组 测试题
-基于范围的for循环
-指针的定义和运算
--指针的定义和运算 测试题
-综合实例
--综合实例
-实验六(上)
--实验六上
-指针与数组
--指针数组
--指针与数组 测试题
-指针与函数
--指针类型的函数
--指向函数的指针
--指针与函数 测试题
-对象指针
--对象指针
--对象指针 测试题
-动态内存分配
--动态内存分配 测试题
-智能指针
--智能指针
-vector对象
--vector对象
--vector对象 测试题
-对象复制与移动
--移动构造
--对象复制与移动 测试题
-字符串
--C风格字符串
--string类
--字符串 测试题
-第6章小结
--第六章小结
-综合实例
--综合实例
-实验六(下)
--实验六(下)