在现有的C++中有枚举类型,关键字为enum,然则它会存在三个问题:
1. 在那些不需要枚举类型表现为int类型时,它却默认表现为int类型,这会导致错误发生。
2. 可转换的枚举会使得他的枚举值在其周围的代码范围内都是可见的,这可能会导致名字冲突。
3. 不可以指定枚举底层数据类型(只能是int型),这可能导致代码代码不容易被理解和兼容性问题,而且不可以进行前向声明。
针对这些隐患,c++11提供了新的新的枚举——枚举类,也叫“强类型枚举”,是强类型的,带有类域,与之前的枚举类型对比如下:
enum Alter{green,yellow,election,red}; //传统的枚举
enumclass Color{red,blue}; //新的枚举类,具有类域,强类型的
enumclass TrafficLight{red, yellow,green};
Alter a = 7; //错误,传统枚举不是强类型,a没有数据类型
Color c = 7; //错误,没有默认的int到Color
int a2 = red; //正确,只有Alter的枚举值没有类域,这里的red肯定是Alter的,Alter枚举自动转换成int
int a3 = Alter::red; //c++11正确,指定了类域,c++98不正确
int a4 = blue; //错误,blue没有指定类域
int a5 = Color::blue; //错误,没有Color到int的转换
Color a6 = Color::blue; //正确
新的枚举类,有着原本枚举的功能,又具备了类的特点,比如类域成员不能进行隐式类型转换,如c和
<span style="white-space:pre"> </span>enumclass Color : char{red, blue};
默认情况下,枚举值的类型是int型:
<span style="white-space:pre"> </span>enumclass TrafficLight{red, green,yellow};
同样的,枚举类指定了底层数据类型从而就能够前向声明,在定义一个枚举类型之前就使用这个枚举类,只要有个预先声明即可。例如:
<span style="white-space:pre"> </span>enumclass Color_code:char; //前向声明
<span style="white-space:pre"> </span>void foobar(Color_code *p); //声明的使用
<span style="white-space:pre"> </span>//...
<span style="white-space:pre"> </span>enumclass Color_code:char{red, yellow, blue, green}; //定义