当前课程知识点:C++语言程序设计基础 > 第4章 类与对象 > 枚举类 > 枚举类
枚举类
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++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
都是整型
也就是说实质上
赋给这两个枚举对象的值
它都是 底层都是整型
那么能不能比较它们相等与否呢
根本不能比较
编译的时候会报错
因为它们属于不同的类型
你无法直接比较
不同枚举类的对象
这就是你使用枚举类的话
比使用简单的枚举类型
它的类型控制更为严格了
-导学
--第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章小结
--第六章小结
-综合实例
--综合实例
-实验六(下)
--实验六(下)