一、enum在C++11的变化
从C++11开始,支持下面的enum形式
enum struct|class 名字 : 类型 { 枚举项 = 常量表达式 , 枚举项 = 常量表达式 , ... }
enum class pet: unsigned int{ Dog, Cat, Monkey, Lion};
enum struct|class 名字 { 枚举项 = 常量表达式 , 枚举项 = 常量表达式 , ... }
enum class pet { Dog, Cat, Monkey, Lion};
enum 名字 { 枚举项 = 常量表达式 , 枚举项 = 常量表达式 , ... } //最原始的定义方法
enum pet { Dog, Cat, Monkey, Lion};
声明的方法
enum struct|class 名字 ;
enum class pet;
enum struct|class 名字 : 类型 ;
enum class pet: unsigned int;
二、实验
变化之后有什么好处呢?下面通过几个实验来说明一下。
实验一:枚举的访问
#include <iostream>
using namespace std;
enum class pet: unsigned int {Dog, Cat, Monkey, Lion};
int main()
{
pet ZooPet;
ZooPet = pet::Dog;
return 0;
}
结论:
在赋值的时候,必须加上pet
作用域。虽然我们定义enum
时候没有使用到namespace
,但编译器应该在编译时候帮我们加上了。
与传统的枚举定义相比,我们可以显示的指定枚举的类型,不用编译器默认指定。
实验二:多个枚举成员重名
首先,使用旧版的枚举
#include <iostream>
using namespace std;
enum pet1 {Dog, Cat, Monkey, Lion};
enum pet2 {Dog, Cat, Monkey, Lion};
int main()
{
pet1 Pet1;
pet2 Pet2;
Pet1 = Dog;
Pet2 = Cat;
return 0;
}
编译器不通过,出现重复定义。
然后,使用C++11版本的枚举
#include <iostream>
using namespace std;
enum class pet1 {Dog, Cat, Monkey, Lion};
enum class pet2 {Dog, Cat, Monkey, Lion};
int main()
{
pet1 Pet1;
pet2 Pet2;
Pet1 = pet1::Dog;
Pet2 = pet2::Cat;
return 0;
}
编译器通过了,因为编译器能区分不同定义域里的成员。
结论:
在使用枚举的时候,尽量使用C++11所支持的枚举。现在C++11已经不算是什么新版本的了,很多项目都是C++11或以上的版本。
三、最后
c++11里有很多奇奇怪怪的特性,其中必定隐含了它的道理,将它们捋清捋清,便是C++学习者所要经历的。