当前课程知识点:C++语言程序设计基础 >  第4章 类与对象 >  结构体与联合体 >  联合体(例4-8)

返回《C++语言程序设计基础》慕课在线视频课程列表

联合体(例4-8)在线视频

联合体(例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++语言程序设计基础》慕课在线视频列表

联合体(例4-8)课程教案、知识点、字幕

大家好

欢迎回来继续学习

C++语言程序设计

这一节我们来学习联合体

联合体虽然在程序中

不是很常用

但是它也是非常有用的一种

数据结构

看起来它的定义与类

与结构体都很像

但是一个根本上的差别

在于联合体的目的

是存储空间的共用

现在我们就来看看

联合体如何定义

那么联合体要用union

这个关键词开头

后面跟着联合体的名称

那么里面我们看到

也是分成公有成员 保护成员

私有成员

我们也可以定义它的成员

但是这些成员

它不是同时存在

同时起作用的

它必须不同时存在

什么意思呢

它实际说是所有的成员

共用相同的内存单元

所以任何两个成员

都不会同时有效

比如说我们定义一个成绩联合体

我们知道

一门课的成绩肯定

它只能选择一种形式

或者是百分制的

或者是分等级的

或者是通过不通过 对吧

所以一个人在一门课

获得了成绩

它只会是一种

这个时候呢

我们就可以像这样来定义一个

成绩联合体

大家看

我们可以这样来定义

这个成绩联合体

这里面有三个成员

一个是等级grade

一个是是否通过pass

一个是百分制成绩percent

这三个成员

它们的类型也不同

那由于某一门课

某一个人的成绩

只可能选择其中的一种

所以我们就可以把它放在

这个联合体里面

我们看这张图

实际上这个Mark联合体对象呢

它将占用比如说四个字节

如果int在这个系统中

是四个字节的话

它就将占用四个字节

为什么呢

因为int占的字节数最多

那么字符型和布尔型

都只占单个字节

它们共用存储空间呢

就按照最多字节数的那个成员

来分配空间

也就是说

如果你将数据作为grade存入了

作为这个等级成绩存入了

将来你只能作为等级成绩取出来

如果你作为通过与否

以布尔值存入了

将来你只能作为布尔值取出来

如果你曾经存入过等级分

或者是通过与不通过的这个标记

然后你往这个对象中

再次存入一个百分制成绩的话

原来存入的数据就会被冲掉

因为它是共用存储空间的

在程序中呢

我们还可以定义无名联合体

我们看看这个例子里面呢

就是定义了一个无名联合体

大家看

这只用了一个

union的这个关键字

而没有联合体的名字

像这样定义以后

只是规定了变量i

和变量f它们要共用内存空间

在程序中使用i

使用f的时候

就像使用普通变量一样

直接使用它们的变量名就可以了

但是我们要注意

如果你给i复了制

紧接着又给f复制的话

在i里面复的制就被冲掉了

因为它们是

共用的同样的存储空间

下面呢

我们就来看一个

使用联合体的例题

在这个例子中呢

我们用了一个联合体

我们要保存成绩

成绩有三种

等级制的

还有通过不通过的

和百分制的成绩

但是同一门课的同一个学生

他肯定只能用一种积分模式

得到一个成绩

所以呢

我们把这三种成绩

放到一个联合体里面

因为它在同一个时刻

不会都起作用了

只会有一个起作用

然后另外呢

就是成绩模式

我们设了一个枚举类型

来表示成绩模式

一共有这样三种模式

于是它就需要三种构造函数

分别按不同的模式去初始化

它不同类型的联合体成员

所以这里有三种构造函数

那么显示函数呢

也是有三种

这个类的显示函数也有三种

它要按照不同的模式

分别显示不同的成绩

那我们看在主函数中

现在构造了三门课程的成绩对象

先是课程名

然后后面给出了什么呢

给出了它的成绩

这个是B 这个是通过

这个是85分

构造了这样三门课程

接下来用这个show函数

去显示三门课程的成绩

所以通过这个呢

我们就体会到

在什么情况下会用到联合体

就是三种成员类型

它不会同时起作用

每个时刻只有一个起作用

那么这时候

就可以让它们共用存储空间

不仅仅是节省了存储空间

还会避免冗余

避免这种错误

比如说我给一个人的成绩

既给了一个B

又给了一个85分

那这就不合适了

他只能要一种成绩

你要用联合体呢

你没办法给他两种成绩

给他的就是一种成绩

C++语言程序设计基础课程列表:

第1章 绪论

-导学

--第1章导学

-计算机系统简介

--计算机系统简介

--计算机系统简介 测试题

-计算机语言和程序设计方法的发展

--计算机语言和程序设计方法的发展

--计算机语言和程序设计方法的发展 测试题

-面向对象的基本概念

--面向对象的基本概念

--面向对象的基本概念 测试题

-程序的开发过程

--程序的开发过程

--程序的开发过程 测试题

-信息的表示和储存

--计算机中的信息与存储单位

--计算机的数字系统

--数据的编码表示

--信息的表示和储存 测试题

-实验指导

--实验一:VS开发环境介绍

第2章 C++简单程序设计(一)

-导学

--第二章导学

-C++语言概述

--C++的特点和程序实例

--C++字符集和词法记号

--C++语言概述 测试题

-基本数据类型、常量、变量

--基本数据类型、常量、变量

--程序举例

--基本数据类型、常量、变量 测试题

-运算与表达式

--算术运算与赋值运算

--逗号运算、关系运算、逻辑运算和条件运算

--Sizeof运算、位运算

--运算优先级、类型转换

--运算与表达式 测试题

-实验二:简单程序设计(上)

--实验二:简单程序设计(上)

第2章 C++简单程序设计(二)

-数据的输入和输出

--数据的输入和输出

--数据的输入和输出 测试题

-选择结构

--if语句

--switch语句

--选择结构 测试题

-循环结构

--循环结构——while语句

--do-while语句

--for语句

--嵌套的控制结构、其他控制语句

--循环结构 测试题

-自定义类型

--自定义类型

--自定义类型

-第2章小结

--第二章小结

-实验二:C++简单程序设计(下)

--实验二C++简单程序设计(下)

第3章 函数

-导学

--导学

-函数定义

--函数定义

--函数定义 测试题

-函数调用

--函数调用(例3-1)

--例3-2

--例3-3

--例3-4

--例3-5

--例3-6

--函数调用 测试题

-嵌套与递归

--函数的嵌套调用(例3-7)

--函数的递归调用(例3-8)

--例3-9

--例3-10

--嵌套与递归 测试题

-函数的参数传递

--函数的参数传递

--函数的参数传递 测试题

-引用类型

--引用类型(例3-11)

--引用类型 测试题

-含有可变参数的函数

--含有可变参数的函数

--含有可变参数的函数 测试题

-内联函数

--内联函数(例3-14)

--内联函数 测试题

-constexpr函数

--constexpr函数

--CONSTEXPR函数课后习题

-带默认参数值的函数

--带默认参数值的函数

--默认参数值例(3-15)

--带默认参数值的函数 测试题

-函数重载

--函数重载(例3-16)

--函数重载 测试题

-C++系统函数

--C++系统函数(例3-17)

--C++系统函数习题

-第3章小结

--第三章小结

-实验三(上)函数的应用

--实验三(上)函数的应用

-实验三(下)函数的应用

--实验三(下)函数的应用

第4章 类与对象

-导学

--导学

-面向对象程序的基本特点

--面向对象程序的基本特点

--面向对象程序的基本特点 测试题

-类和对象

--类和对象的定义

--类和对象的程序举例

--类和对象 测试题

-构造函数

--构造函数基本概念

--构造函数例题(1)——例4-1

--构造函数例题(2)——例4-2

--委托构造函数

--复制构造函数

--复制构造函数调用举例

--构造函数 测试题

-析构函数

--析构函数

--析构函数 测试题

-类的组合

--类的组合

--类的组合程序举例

--前向引用声明

--类的组合 测试题

-UML简介

--UML简介

--UML简介课后习题

-结构体与联合体

--结构体(例4-7)

--联合体(例4-8)

--结构体与联合体 测试题

-枚举类

--枚举类

--枚举类 测试题

-第4章小结

--第四章小结

-实验四(上)

--实验四(上)

-实验四(下)

--实验四(下)

第5章 数据的共享与保护

-导学

--导学

-标识符的作用域与可见性

--标识符的作用域与可见性

--标识符的作用域与可见性 测试题

-对象的生存期

--对象的生存期

--对象的生存期 测试题

-类的静态成员

--静态数据成员(例5-4)

--静态函数成员(例5-5)

--类的静态成员 测试题

-类的友元

--类的友元(例5-6)

--类的友元 测试题

-共享数据的保护

--共享数据的保护(例5-7)

--共享数据的保护 测试题

-多文件结构和预编译命令

--多文件结构和预编译命令(例5-10)

--多文件结构和预编译命令 测试题

-第5章小结

--小结

-实验五

--实验五

第6章 数组、指针与字符串(一)

-导学

--导学

-数组的定义与初始化

--数组的定义与使用

--数组的储存与初始化

--一维数组应用举例

--数组的定义与初始化 测试题

-数组作为函数的参数

--数组作为函数参数(例6-2)

--数组作为函数的参数 测试题

-对象数组

--对象数组

--对象数组 测试题

-基于范围的for循环

--基于范围的for循环

-指针的定义和运算

--指针的概念、定义和指针运算

--指针的初始化和赋值

--指针的算术运算、关系运算

--指针的定义和运算 测试题

-综合实例

--综合实例

-实验六(上)

--实验六上

第6章 数组、指针与字符串(二)

-指针与数组

--用指针访问数组元素

--指针数组

--指针与数组 测试题

-指针与函数

--以指针作为函数参数

--指针类型的函数

--指向函数的指针

--指针与函数 测试题

-对象指针

--对象指针

--对象指针 测试题

-动态内存分配

--动态分配与释放内存

--申请和释放动态数组(一)

--申请和释放动态数组(二)

--动态内存分配 测试题

-智能指针

--智能指针

-vector对象

--vector对象

--vector对象 测试题

-对象复制与移动

--深层复制与浅层复制

--移动构造

--对象复制与移动 测试题

-字符串

--C风格字符串

--string类

--字符串 测试题

-第6章小结

--第六章小结

-综合实例

--综合实例

-实验六(下)

--实验六(下)

联合体(例4-8)笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。