enum
enum提供了另一种创建符号常量的方式,这种方式可以代替const。还允许定义新类型,但必须按严格的限制进行
- 枚举定义与赋值
enum spectrum {red, black, orange, yellow, green, blue};
/* 1. 在不强制类型转换的情况下,只能将定义枚举时使用的枚举量赋值给这种枚举变量*/
spectrum sp1 = red; /* valid */
spectrum sp2 = 0; /* invalid */
/* 2. 对于枚举只定义了赋值运算 */
sp1 += 1; /* invalid */
/* 3. 枚举量是整形, 可被提升为int类型, 但int不能自动转换为枚举类型 */
int color = red; /* valid */
sp1 = 2; /* invalid */
/* 尽管未给枚举定义运算符+, 但用于算数表达式时, 枚举被转换为整数,因此 */
int clolor = red + black; /* color = 0 + 1, red+black被转换为0+1*/
/* 如果int值是有效的,可通过强制类型转换,将其赋值给枚举变量 */
sp1 = spectrum(2); /* valid, */
- 显式设置枚举量的值
/* 1. 指定的值必须为整数,*/
enum bits{ont = 1, two = 2, four = 4, eight = 8};
/* 2. 且可以只显式的定义其中一些枚举量的值 */
enum bigstep {first, second = 100, third};
/* 4. 且可以创建多个值相同的枚举量 */
enum status{zero, null = 0, one, numero_uno = 1};
/* 在C++早期版本中,只能将int值(或提升为int的值)赋给枚举量,但这种限制在之后取消了,因此可以使用long甚至long long 类型的值 */
- 枚举的取值范围
对于枚举来说,只有什么中指出的那些值是有效的,然而C++通过强制类型转换,增加了可赋值给枚举变量的合法值,每个枚举都有取值范围(range),通过强制类型转换,可以将取值范围中的任何整数值赋值给枚举变量
enum bits{one = 1, two = 2, four = 4, eight = 8};
bits myflag;
myflag = bits(6); // valid, 6不是枚举值,但在枚举bits定义的取值范围内,
/*
取值范围的定义:
1. 首先找到上限,需知枚举量的最大值。找到大于这个最大值的、最小的2的幂, 将其减去1,便是取值范围的上限。
enum bigstep {first, second = 100, third};
bigstep最大值为101, 比这个数大的最小值为128,因此取值范围的上限为127
2. 计算下限,需知枚举量的最小值。如果它不小于0,则取值范围的下限为0;否则,采用寻找上限相同的方式,结果加负号
enum color {red = -6, yellow, black = 6};
最下的2的幂为8,8-1=7, 因此下限为-7
*/
- 枚举存储空间
枚举的存储空间由编译器决定。对于取值范围最小的枚举,使用一个字节或更少的空间,而对于包含long类型值的枚举,则使用4字节