C++的enum工具提供了另一种创建符号常量的方式,这种方式可以代替const。使用enum的句法与使用结构相似,例如:enum spectrum { red, orange , yellow, green, blue, violet, indigo ,ultraviolet};
这条语句有两个含义:
(1)、让spectrum成为新类型的名称:spectrum被称为枚举,就像struct变量被称为结构一样
(2)、将red 、orange、yellow等作为符号常量,它们对应的整数值0~7.这些常量叫做枚举量。
这个地方需要做一下说明:spectrum是类型名称,就像int、long一样,是类型的名称,以后可以用这个类型名称声明变量。另外,用这个类型声明的变量取值必须是大括号里的值,其他值无效。而且默认的情况下,第一个枚举量的值为0,第二个为1,以此类推。也可以显示的指定整数值来覆盖默认值。
可以用枚举名来声明这种类型的变量:spectrum band;
下面介绍一下枚举变量的特殊属性:
1、在不进行强制类型转换的情况下,只能将定义枚举时使用的枚举量赋给这种枚举的变量。
band = blue; //有效,因为blue是枚举量中的一个
band =2000; //无效,2000不是枚举量
因此,spectrum变量受到限制,只有8个可能的值,试图将非enum值赋给enum变量出现编译器错误。
2、对于枚举,只定义了赋值运算符。具体来说,没有为枚举定义算数运算符
band = orange; //有效
++band; //无效
band = orange +red; //无效
3、枚举量是整型,可被提升为int类型,但是int类型不能自动转换为枚举类型。
int color = blue; //有效
band = 3; //无效,虽然3对应的green,但是不能这么赋值。除非经过强制类型转换band = spectrum(3);
color = 3+ red; //有效
4、当然,如果打算只使用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称。如下:
enum { red, orange , yellow, green, blue, violet, indigo ,ultraviolet};
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和umero_uno都为1。
说明:其实枚举量可以作为一种创建整数与代表字符的对应关系。比如用在switch语句中,先用enum{one,two,three,...},在switch语句中就可以用case one: case two: ....了。
6、枚举的取值范围
每个枚举值都有取值范围,通过强制类型转换,可以将取值范围中的任何整数值赋给枚举变量,即使这个值不是枚举值。例如:
enum bits{ one =1, two = 2, four = 4, eight = 8};
bits myflag;
则下面的代码将是合法的:
myflag = bits(6); //因为6在bits的范围之内
取值范围是这么定义的:
(1)上限值:找到大于这个最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。例如,bitstep的最大值枚举值为101.在2的幂中,比这个数大的最小值为128,因此取值范围的上限为127.
(2)下限值:需要知道枚举值的最小值,如果它不小于0,则取值范围的下限为0;否则采用与寻找上限方式相同的方式,但加上负号。例如,如果最小枚举值是-6,而比它小的、最大的2的幂是-8(加上负号),因此下限是-7.