在C++11之前的枚举(enum),是没有办法两个枚举(enum)内有相同枚举名的。如果还不知道C++中枚举(enum)是什么,可以看这篇:枚举enum
如:苹果和桔子都有大,中,小。写个代码来说明下:
1 2 |
enum apple{big, medium, small, special}; enum orange{big, medium, small}; |
以上代码编译不会通过的,因为apple和orange在同一个作用域内。之前我们可能会改成用size来做枚举,但apple枚举又多了一个枚举值,这样在C++11之前版本中就不会很好处理。
哪C++11是如何处理这类问题?
C++11提供一种新枚举(enum),其枚举量的作用域为类。
具体声明如下:
1 2 |
enum class apple{big, medium, small, special}; enum class orange{big, medium, small}; |
声明中的class关键字,也可以用struct。
1 2 |
enum struct apple{big, medium, small, special}; enum struct orange{big, medium, small}; |
这样枚举的作用域为类后,不同枚举(enum)定义中的枚举量就不会有名称冲突。
如何使用作用域内枚举?
使用枚举名来限定枚举量,这样编译器才会明白用哪个的枚举量。
1 2 |
apple a1 = apple::big; orange o1 = orange::big; |
C++11作用域内枚举不能默认隐式转换成int
1 2 3 4 5 6 7 |
//C++ 98 int i = a1; //正确 //C++ 11 int j = o1; //错误 int k = int(o1); //显示类型转换 |
上面代码可以看出C++11代码会更加安全,如一定要转换,必需显示类型转换。
为什么不能直接转换具体原因?
C++98中,枚举类的具体值类型是什么,可能随系统而异,没有硬规定。但一般都会是int类型。
C++11中,枚举类的具体值类型不在依赖系统,可以自己定义。如不指定,默认C++11作用域内枚举的值类型是int。
如何指定C++11作用域内枚举的值类型?
指定枚举值类型定义语法:
1 2 |
enum class :short apple{big, medium, small, special}; //值类型为short enum class :int orange{big, medium, small}; /值类型为int |