枚举
C++的enum提供类另一种创建符号常量的方式,这种方式可以代替const。它还允许定义新类型,但必须按严格的限制进行。使用enum的句法与使用结构相似。例如:
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
- spectrum是新类型的名称:spectrum被称为枚举(enumeration);
- red、orange、yellow等作为符号常量,它们对用整数值0~7。这些常量叫作枚举量(enumerator)。
默认情况下,将整数值赋给枚举量,第一个枚举的值为0,第二个枚举的值为1,以此类推。
可以用枚举名来声明这种类型的变量:
spectrum band;
在不进行强制类型转换的情况下,只能讲定义枚举时使用的枚举量赋给这种枚举的变量:
band = blue; //合法,blue是一个枚举量
band = 2000; //不合法,2000不是一个枚举量
因此,spectrum变量受到限制,只有8个可能的值。
对于枚举,只定义了赋值运算符,而没有定义算术运算:
band = orange; //合法
++band; //不合法
band = orange + red; //不合法
枚举量是整型,可被提升为int类型,但int类型不能自动转换为枚举类型:
int color = blue; //合法,枚举量提升为int类型
band = 3; //不合法,int不能转换为枚举量
color = 3 + red; //合法,red转换为int类型
如果int值是有效的,则可以通过强制类型转换,将它赋给枚举变量:、
band = spectrum(3);
如果只打算使用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称:
enum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
1. 设置枚举量的值
可以使用赋值运算符显式地设置枚举量的值:
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
在C++的早期版本中,只能将int值赋给枚举量,但这种限制取消了,但这种限制取消了,现在可以使用long,long long等。
2. 枚举的取值范围
每个枚举都有取值范围,通过强制类型转换,可以将取值范围中的任何整数值赋给枚举变量,即使这个值不是枚举值,例如:
enum bits{one = 1, two = 2, four = 4, eight = 8};
bits myflag;
myflag = bits(6); //合法,虽然6不是枚举值,但是它位于枚举定义的取值范围内
取值范围的定义:首先要找出上限,需要知道枚举量的最大值M,则上限是大于M的最小的2的幂次减一。其次要计算下限,需要知道枚举量的最小值m,如果m≥0,则下限为0;否则与寻找上限的方式相同,但要加上负号。