枚举 enum
enum spectrum { red, orange,yellow,green,blue,violet,indigo,ultraviolet };
//enum 定义了spectrum是枚举类型的变量,里面的内容称为枚举量,默认情况下,将整数值赋给枚举量
//注意里面是逗号,最后一个不能加上逗号,结尾是分号
int main()
{
//注意事项1:
spectrum a = blue;//只能将定义枚举时使用的枚举量赋给这种枚举的变量
a = yellow;//枚举只有赋值运算符
//a=3;不合法,不能将int类型的变量赋值给枚举类型
// a = orange + yellow;不合法
//++a;
//注意事项2:枚举量是整形,可以自动转换为int类型,但是int类型不能被转换为枚举类型;(不能发生隐式转换)
int color = orange;//color为1; 枚举类型直接赋值给整形
color = orange + 3;//color为4;
cout << a << endl;//输出2,a被自动转换为int类型
//a = red + orange;不合法,原因是red和orange会被被转换为int类型,但是int类型的不能赋值给枚举类型
a = (spectrum)3;//这样是合法的,先将整形转换为枚举类型,a=spectrum(3);也是可以的
//使用:设置枚举量的值
enum bits { one = 1,two=2,four=4,five,eight=8 };
//可以自己显示指定枚举变量的值,没有显示指定的,会根据前一个枚举变量+1默认指定
system("pause");
return 0;
}
传统枚举存在一些问题,就是两个定义中的枚举量可能会发生冲突,下面介绍作用域内枚举
//作用域内枚举
enum eggs {small,medium,large};
enum shirt{small,medium,large,xlarge};//编译器会提示非法,原因是原因是两个枚举位于相同的作用域内
enum class eggs {small,medium,large};
enum class shirt{small,medium,large,xlarge};//也可以将class换成struct
//注意1:使用时,需要枚举名来限定枚举量
eggs a=eggs::large;
shirt b=shirt::small;
//注意2:常规类型的枚举可以自动转换为整形int,但是作用域内枚举不能隐式转换为整形;
eggs a = eggs::small;
//int b = a;报错
int b = (int)a;//显示指定之后就不会报错