当前课程知识点:C++语言程序设计基础 >  第4章 类与对象 >  枚举类 >  枚举类

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

枚举类在线视频

枚举类

枚举类

枚举类定义

l 语法形式

enum class 枚举类型名: 底层类型 {枚举值列表};

l 例:

enum class Type { General, Light, Medium, Heavy};

enum class Type: char { General, Light, Medium, Heavy};

enum class Category { General=1, Pistol, MachineGun, Cannon};

枚举类的优势

l 强作用域,其作用域限制在枚举类中。

n    例:使用Type的枚举值General:

Type::General

l 转换限制,枚举类对象不可以与整型隐式地互相转换。

l 可以指定底层类型

n    例:

enum class Type: char { General, Light, Medium, Heavy};

例4-9 枚举类举例

#include<iostream>

using namespace std;

enum class Side{ Right, Left };

enum class Thing{ Wrong, Right };  //不冲突

int main()

{

    Side s = Side::Right;

    Thing w = Thing::Wrong;

    cout << (s == w) << endl;  //编译错误无法直接比较不同枚举类

    return 0;

}

 

 


下一节:第四章小结

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

枚举类课程教案、知识点、字幕

大家好

欢迎回来继续学习

C++语言程序设计

这一节我们来学习枚举类

枚举类也称为强类型的枚举

在第二章中

我们学习过枚举类型

那是从C语言

继承过来的枚举类型

比较简单

但是它有个问题

也就是枚举类型

可以自动隐含转换为整数类型

也就是说

它的类型定义并不是很严格

那个枚举类型实际上

就是整数的一个子集

也只能是整数的一个子集

在C++11新标准中呢

又推出了一种新的枚举定义办法

叫做枚举类

也称作强类型枚举

现在我们就看看

枚举类它的定义语法是什么

它有什么样的特点和优势

那么枚举类定义的语法形式呢

要用到class这个关键字

在enum关键字后面跟一个class

然后是枚举类型名

接下来呢是冒号

冒号之后还可以定义一个

底层类型名

底层类型名是什么呢

实际上默认的底层类型

就是int类型

就像在简单的枚举类型中

我们定义的所有枚举常量

实际上都是整数类型一样

在这里呢

如果你不定义底层类型

它默认的这些枚举值

就都是int类型

但是在新标准中

我们可以定义

除了int以外的其他的类型

在这指定底层类型

我们看看这个例子

第一个例子中

定义这样一个Type枚举类型

没有指定底层类型名

所以呢

Type这个枚举里面的

所有枚举常量都是int类型的

那么在第二个例子中呢

我们也是定义

这样一个Type类型

但是指定了它的底层类型

是字符型

所以这些枚举常量

都是字符类型的

同样地

我们在定义这样的枚举类的时候

也可以去指定枚举常量的值

比如说在这第三个例子里面

我们指定General它是1

然后后面的枚举常量就依次增加

使用枚举类

比起

使用以前的简单枚举类型来说

它有什么好处和优势呢

第一点就是

它的作用域强制

那么第二点呢

禁止这种隐含的将枚举类型

转换成整数

对于类型的限制更为严格了

那么第三个优势呢

就是我们刚才在例子中看到的

可以指定底层类型

强作用域指的是

将枚举值的作用域

限制在枚举类之中了

比如说

我们使用Type这个枚举类型

它的枚举值General的时候

就必须要带上枚举类的类名Type

你不能只是说

我就使用General这个名字

因为General属于

Type这个枚举类

而定义简单的

从C语言继承过来的

这个枚举类型的时候呢

我们在程序中

是可以直接使用枚举值的

那么把这个作用域

限制在枚举类里面

就可以避免

在不同枚举类型之间

它们的枚举值重名的问题

也就是说

只要在不同的枚举类中

那你定义的枚举值

一定不会互相重名

因为它还有一个枚举类名

在前面限定着

这样写程序更为方便了

那么转换限制呢

指的是枚举对象

不能直接与整型隐式地互相转换

这样的话呢

就对类型限制更为严格了

语法对于这个程序的类型保障

就更强

那么可以指定底层类型

使得这个枚举常量

它的定义范围更加丰富了

不仅可以用整数来作为枚举常量

你可以用你觉得方便的

喜欢的其他类型来作为枚举常量

根据你要解决的问题的类型

不一样

你可以选择合适的类型

来作为枚举值

下面呢我们来看一个

枚举类的例题

这个例子呢

演示了枚举类的特点

我们看这里定义了两个枚举类

一个Side 一个Thing

在Side里面又有Right Left

在Thing里面有Wrong Right

这个会不会冲突呢

并不冲突

因为这个Right

它的Side里面那个Right

它的作用域就在Side

这个枚举类里面

而这个名字

Thing里面这个Right

它的作用域

就属于Thing这个枚举类

大家可以试试

你如果不用枚举类

而用前面讲的那种简单枚举类型

你这样定义试试

那么你就会发现

在不同的枚举类型中

如果它的枚举常量值

有同样的名字

那是会发生冲突的

而你用了枚举类

它就不发生冲突了

接下来呢我们再来看

它的类型限制更为严格了

比如说我们在这儿定义了

一个枚举类的对象S

给它赋值为Side Right

定义了一个枚举类

Thing的对象W

给它赋值为Thing Wrong

现在我们试图把这两个枚举对象

拿来作一下比较

因为我们看

这两个枚举类都没有定义

它的底层类型

所以呢

实际上它的底层类型都是int

都是整型

也就是说实质上

赋给这两个枚举对象的值

它都是 底层都是整型

那么能不能比较它们相等与否呢

根本不能比较

编译的时候会报错

因为它们属于不同的类型

你无法直接比较

不同枚举类的对象

这就是你使用枚举类的话

比使用简单的枚举类型

它的类型控制更为严格了

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章小结

--第六章小结

-综合实例

--综合实例

-实验六(下)

--实验六(下)

枚举类笔记与讨论

也许你还感兴趣的课程:

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