C++11中新引入的enum类型
一、引言
在C++11中,引入了一个新的枚举类型——enum class(或称为作用域枚举类型),它相较于传统的enum类型有几个关键的不同点。enum class提供了更强的类型检查和封装,减少了命名冲突的可能性,并允许更加清晰地表达枚举的意图。
二、传统枚举(enum)的缺点
在C++11之前,枚举(enum)类型是隐式转换为整型的,这可能会导致一些意料之外的类型安全问题。此外,传统枚举的作用域是从声明点到声明该枚举的文件末尾,这可能会导致在不同上下文中名称的冲突。
enum LightColor{
RED, GREEN, YELLOW
};
enum ClothesColor{
RED, GREEN, YELLOW // 此处会报重复声明的错误,因为LightColor枚举中已经声明了RED等
};
int main(){
LightColor color1 = RED;
ClothesColor color2 = RED;
}
以上代码会有编译错误,因为LightColor中声明了RED,而在ClothesColor中又声明了RED,因此两者冲突。
三、在C++11中避免此冲突
enum class LightColor{
RED, GREEN, YELLOW
};
enum class ClothesColor{
RED, GREEN, YELLOW
};
int main(){
// 在枚举值前加上类型的限定符,表明枚举值是哪个类型的值
// 这样就可以避免产生冲突了
LightColor color1 = LightColor::RED;
ClothesColor color2 = ClothesColor::RED;
}
四、enum class的优点
- 作用域限定:enum class的成员仅在枚举本身的作用域内可见,需要使用枚举类型名作为前缀来访问其成员,这减少了命名冲突的可能性。
- 不隐式转换为整型:enum class类型的值不会自动转换为整型(如int),除非显式进行类型转换。这提高了类型安全性。
- 更好的命名空间支持:enum class可以在更复杂的命名空间中声明,使得枚举的使用更加灵活和清晰。
- 允许指定底层类型:通过: 底层类型语法,enum class可以指定其底层数据类型(如int、char等),以控制枚举值的存储和表示。
#include <cstdint>
// 指定LightColor的底层使用int8_t整数类型
enum class LightColor: int8_t{
RED = -1, GREEN = 0, YELLOW = 8
};
五、示例
#include <iostream>
// 定义一个enum class
enum class Color {
RED, GREEN, BLUE
};
int main() {
// 枚举类型的变量声明
Color myColor = Color::RED;
// 正确使用枚举类型
if (myColor == Color::RED) {
std::cout << "The color is red." << std::endl;
}
// 错误用法:没有前缀Color::会导致编译错误
// if (myColor == RED) { // 错误
// 显示转换为整型(如果需要)
int colorValue = static_cast<int>(myColor);
// 注意:不同的枚举值可以有不同的底层值
enum class Status : char {
OK = 'a',
ERROR = 'b'
};
Status status = Status::OK;
char statusChar = static_cast<char>(status);
return 0;
}
六、小结
enum class是C++11引入的一种新的枚举类型,它通过提供作用域限定、避免隐式类型转换以及允许指定底层类型等方式,改进了传统枚举类型(enum)的使用。这使得enum class成为C++11及更高版本中推荐使用的枚举类型。
附:c++11新增的其他性