C++enum工具提供了另一种创建符号常量的方式,这种方式可以代替const。例如:
enum spectrum {red,orange,yellow,green,blue,violet,indigo,ultraviolet};
在默认情况下,将整数值赋给枚举量,第一个枚举量的值为0,第二个枚举量的值为1,一次类推。可以通过显式地指定整数值来覆盖默认值。
注意:
(1)在不进行强制类型转换的情况下,只能将定义枚举时使用的枚举量赋给这种枚举的变量。例如:
spectrum band:
band = blue;//valid,blue ia an spectrum
band = 2000;//invalid,2000 is an enumerator
(2)对于枚举,只定义了赋值操作符。具体的说,没有为枚举定义算术运算:
band = orange;//valid
++band;//not valid
band = orange + red;//not valid
(3)枚举量是整型,可被提升为int类型,但int类型不能自动转换为枚举类型:
int color = blue;//valid
band = 3;//not valid
color = 3 + red;//valid
(4)如果int值是有效的,则可以通过强制类型转换,将它赋给枚举变量:
band = spectrum(3);//typecast 3 to type spectrum
但如果试图对一个不适当的值进行强制类型转换,将出现什么情况呢?结果是不确定的,这意味着这样做不会出错,但不能依赖得到的结果:
band spectrum(40005);
(5)设置枚举量的值
①可以使用赋值操作符来显式的设置枚举量的值,指定的值必须是整数
enum bits{one = 1,two = 2,four = 4,eight = 8};
②指定的值必须是整数。也可以只显式地定义其中一些枚举量的值
enum bigstep{first,second = 100,third};
这里,first在默认情况下为0.后面没有被初始化的枚举量的值将比其前面的枚举量大1。因此,third的值为101。
③可以创建多个值相同的枚举量
enum{zero,null = 0,one,numero_uno = 1};
其中,zero和null都为0,one和numero_uno都为1.
(6)在C++早起的版本中,只能将int值(或提升为int的值)赋给枚举量,不过这种限制已经被取消了,因此可以使用long类型的值。
(7)枚举的取值范围
最初,对于枚举来说,只有声明中指出的那些值是有效的。不过,C++现在通过强制类型转换,增加了可赋给枚举变量的合法值。每个枚举都有取值范围(range),通过强制类型转换,可以将取值范围中的任何整数赋给枚举变量,即使这个值不是枚举值。
enum bits{one = 1,two = 2,four = 4,eight = 8};
bits myflag;
myflag = bits(6)//其中6不是枚举值,但它位于枚举定义的取值范围内
取值范围的定义如下:
首先,要找出上限,需要知道枚举量的最大值。找到对于这个最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。要计算下限,需要知道枚举量的最小值。如果它不小于0,则取值范围的下限位0;否则,采用与寻找上限方式相同的方式,但加上负号。例如,如果最小的枚举量为-6,而比它小的,最大的2的幂是-8(加上负号),因此下限为-7。