限定作用域的枚举类型
C++11引入了限定作用域的枚举类型,与普通枚举类型不同,限定作用域的枚举类型的成员名字在作用域外不可访问,所以这种枚举类型的名字可以和作用域外的名字重复。
enum class Color1{red,yellow,green};//限定作用域的枚举类型
enum struct Color2{ red, yellow, green };//限定作用域的枚举类型
enum Color3 { red, yellow, green };//不限定作用域的枚举类型
enum Color4 { red, yellow, green };//错误,重复定义了red, yellow, green
int main(void)
{
Color1 color1 = Color1::red;
Color2 color2 = Color2::red;
Color3 color3 =red;
system("pause");
return 0;
}
枚举类型与整型
默认情况下,枚举成员值从0开始,依次加1,不过我们也可以为一个或几个枚举成员指定专门的值,没有显示提供初始值的枚举成员值等于之前枚举成员值加1。
enum Color { red=2, yellow, green };
int main(void)
{
std::cout << red << std::endl;//2
std::cout << yellow << std::endl;//3
std::cout << green << std::endl;//4
system("pause");
return 0;
}
不限定作用域的枚举类型能自动转换为整型,限定作用域的枚举类型不会进行隐式转换。
enum Color1 { red=2, yellow, green };
enum class Color2 { red = 2, yellow, green };
int main(void)
{
int i = red;
int j = Color2::red;//错误
system("pause");
return 0;
}
默认情况下限定作用域的枚举成员类型是int,不限定作用域的枚举类型则不存在默认类型,我们可以使用冒号更改枚举成员的整数类型。
enum Color1:long long { red=2, yellow, green };
enum class Color2 { red = 2, yellow, green };
int main(void)
{
auto color1 = red;
auto color2 = Color2::red;
std::cout << sizeof(color1) << std::endl;//8
std::cout << sizeof(color2) << std::endl;//4
system("pause");
return 0;
}
尽管枚举对象能够转换为整型,但是不能直接将整型值传给枚举形参。
enum Color {red};
void printColor(Color color)
{
std::cout << color << std::endl;
}
int main(void)
{
printColor(0);//错误
printColor(red);
system("pause");
return 0;
}