大家好
欢迎回来继续学习
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
都是整型
也就是说实质上
赋给这两个枚举对象的值
它都是 底层都是整型
那么能不能比较它们相等与否呢
根本不能比较
编译的时候会报错
因为它们属于不同的类型
你无法直接比较
不同枚举类的对象
这就是你使用枚举类的话
比使用简单的枚举类型
它的类型控制更为严格了