一、枚举简介
定义了一种新的数据类型,使用方法与结构体相似,但是必须严格按照限制进行。
enum spec {red, yellow, blue, indigo};
在上例语句中,完成了两件事情:
1、让spec成为了类型的名称,spec被称为枚举。
2、将red、yellow、blue等作为符号常量,对应整数值0-3,这些常量叫做枚举量。在默认情况下,将整数值赋给枚举量,第一个枚举量的值为0,第二个为1,后面以此类推。
二、设置值
1、可以使用赋值运算符显式的设置枚举量的值:
enum bits {one = 1, two = 2, four = 4. eight = 8};
2、指定的值必须是整数,也可以只显式的定义其中一些枚举量的值:
enum bigstep {first, second = 100, third};
在上例中,first在默认情况下为0, 后面没有初始化的枚举量值将比前面枚举量的值大1, 因此third的值为101。
3、可以创建多个值相同的枚举量:
enum num {zero, null = 0, one, numero_uno = 1};
三、枚举取值范围
最初,对于枚举类型来说,只有声明中指出的枚举量是有效的,可以用于给枚举变量赋值。
现在,可以通过强制转换,增加了可赋值给枚举变量的合法值,每个枚举都有取值范围,通过强制转换,可以将取值范围内的任何整数值赋值给枚举变量,即使这个值不是枚举值。
enum bits {one = 1, two = 2, third = 3, four = 4, eight = 8};
enum myflag;
myflag = bits(6); //valid, because 6 is in bits range
在上例中,6不是声明中的枚举值,但是它位于枚举定义的整数取值范围内(1-8)。
其中取值范围的定义如下:
1、找出上限:先找到枚举量的最大值,找到大于这个最大值的、最小的2的幂,然后将其减去1,得到的便是取值范围的上限,例如去前面定义的bigstep最大枚举值是101,比此数大的最小2的幂是128,因此取值范围为127。
2、找出下限:先找到枚举量的最小值,如果不小于0,则取值范围的下限为0;否则与寻找上限方式相同的方法(找比它小的、最大的2的幂加上负号,在加1)。例如最小枚举值为-6,而比它小的,最大的2的幂是-8(加上负号),因此下限为-7。
四、作用域枚举
C++11提供了新的枚举方式,用于解决传统枚举存在的一些问题。其中之一为两个枚举定义的枚举量同名时会存在冲突。
enum egg {small, medium, large, jumbo};
enum shirt {small, medium, large, xlarge};
如上例所示,此时传统枚举将无法通过编译, 因为这两个枚举位于相同的作用域内,它们的同名枚举量在使用时将发生冲突,为了解决这个问题,C++11将枚举量的作用域限制为类,此时枚举量在使用时都需要枚举名来限定。
egg choice = egg::large;
shirt floyd = shirt::large;
枚举量的作用域为类以后,不同枚举定义内相同名枚举量就不会发生名称冲突了。
C++11中的作用域枚举不支持隐式的转换为整形,但是常规枚举可以,这使用时并不安全。
enum egg {small, medium, large, jumbo};
enum class shirt {small, medium, large, xlarge};
egg one = small;
shirt rolf = shirt::small;
int king = one;
int ring = rolf; // not allowed, no implicit type conversion;