[TOC]

文章转自:https://www.runoob.com/w3cnote/cpp-enums-intro-and-strongly-typed.html

文章参考:https://www.yisu.com/zixun/311515.html

概述

众所周知,C/C++ 语言可以使用 #defineconst 创建符号常量,而使用 enum 工具不仅能够创建符号常量,还能定义新的数据类型,但是必须按照一定的规则进行,下面我们一起看下 enum 的使用方法。

枚举类型(enumeration)使我们可以将一组整型常量组织在一起。和类一样,每个枚举类型定义了一种新的类型。枚举属于字面值常量类型。

C++包含两种枚举:限定作用域的和不限定作用域的。这里主要介绍限定作用域的。不限定作用域的使用可以参考: http://blog.csdn.net/fengbingchun/article/details/51778977

枚举量的声明和定义

(1) 首先,请看下面的语句:

1
enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};

这句话有两个作用:

  • 第一:声明 enumType 为新的数据类型,称为枚举(enumeration);
  • 第二:声明 Monday、Tuesday 等为符号常量,通常称之为枚举量,其值默认分别为 0-6。(后面会介绍怎样显式的初始化枚举量的值)

(2) 接着利用新的枚举类型 enumType 声明这种类型的变量:enumType Weekday 就像使用基本变量类型int声明变量一样,如 int a; 也可以在定义枚举类型时定义枚举变量

1
enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}Weekday;

然而与基本变量类型不同的地方是,在不进行强制转换的前提下,只能将定义的枚举量赋值给该种枚举的变量,如:Weekday = Monday; 或者 Weekday = Sunday; 不能将其他值赋给枚举变量,如:Weekday = 10; 这是不允许的,因为 10 不是枚举量。也就是说 Weekday 只能是定义的 Monday-Sunday 这些定义过的枚举量。然而这不是绝对的,第六条会讲到利用强制类型转换将其他类型值赋给枚举变量。

(3) 上面讲不能将非枚举量赋给枚举变量,那么能不能将枚举量赋给非枚举变量呢?如:int a=Monday; 这是允许的,因为枚举量是符号常量,这里的赋值编译器会自动把枚举量转换为int类型。

(4) 前面讲可以对枚举进行赋值运算,那枚举变量能不能进行算术运算呢?

1
Weekday++;Weekday = Monday + Tuesday;

这是非法的,因为这些操作可能导致违反类型限制,比如:

1
2
Weekday = Sunday;
Weekday++;

Weekday 首先被赋予枚举量中的最后一个值 Sunday(值为6),再进行递增的话,Weekday 增加到 7,而对于 enumType 类型来说,7 是无效的。

总结:对于枚举,只定义了赋值运算符,没有为枚举定义算术运算。

**(5)**不能对枚举量进行算术运算,那么枚举量能不能参与其他类型变量的运算呢?

1
2
int a;
a = 1 + Monday;

这是允许的,因为编译器会自动把枚举量转换为 int 类型。

**(6)**第二条讲:在不进行强制转换的前提下,只能将定义的枚举量赋值给该种枚举的变量,言下之意就是可以通过强制转换将其他类型值赋给枚举变量:

1
Weekday = enumType(2);

等同于:

1
Weekday = Wednesday;

但是,如果试图将一个超出枚举取值范围的值通过强制转换赋给枚举变量,会出现什么结果?

1
Weekday = enumType(20);

结果将是不确定的,这么做不会出错,但得不到想要的结果。

自定义枚举量的值

(1) 前面讲通过定义 enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}; 枚举量 Monday、Tuesday 等的值默认分别为 0-6,我们可以显式的设置枚举量的值:

1
enum enumType {Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7};

指定的值必须是整数!

(2) 也可以只显式的定义一部分枚举量的值:

1
enum enumType {Monday=1, Tuesday, Wednesday=1, Thursday, Friday, Saturday, Sunday};

这样 Monday、Wednesday 均被定义为 1,则 Tuesday=2,Thursday、Friday、Saturday、Sunday 的值默认分别为 2、3、4、5。

总结:未被初始化的枚举值的值默认将比其前面的枚举值大1。

(3) 第二条还说明另外一个现象,就是枚举量的值可以相同。

枚举的取值范围

枚举类型

C++11新标准引入了限定作用域的枚举类型(scoped enumeration)。定义限定作用域的枚举类型的一般形式是:首先是关键字enum class(或者等价地使用enum struct),随后是枚举类型名字以及用花括号括起来的以逗号分隔的枚举成员(enumerator)列表,最后是一个分号。

枚举作用域(enumeration scope)是指枚举类型的成员的名字的作用域,起自其声明之处,终止枚举定义结束之处。C语言规定,枚举类型的成员(enumerator)的可见范围被提升至该枚举类型所在的作用域内。这被认为有可能污染了外部的作用域,为此,C++11引入了枚举类(enum class)解决此问题。

定义不限定作用域的枚举类型(unscoped enumeration)时省略掉关键字class(或struct),枚举类型的名字是可选的。