在C++11及以后的版本中,引入了枚举类(也称为强类型枚举或作用域枚举),这是对传统枚举(C风格枚举)的一个改进。枚举类提供了更好的类型安全和作用域控制。
传统枚举(C风格枚举)
传统枚举在C++中类似于整数类型,但它们限制了可以赋给变量的值的集合。然而,它们没有类型安全性,并且它们的枚举值隐式地转换为整数。
enum Color { RED, GREEN, BLUE };
Color c = RED; // 没问题
int i = RED; // 隐式转换,也没有问题
枚举类(C++11及以后)
枚举类提供了更严格的类型检查和更好的作用域控制。枚举类类型不会隐式地转换为其他类型(除了用户定义的显式转换),并且枚举值的作用域被限制在枚举类内部。
enum class Color : unsigned int { RED, GREEN, BLUE }; Color c = Color::RED; // 注意这里需要使用 Color:: 前缀
// int i = RED; // 错误,RED 不在当前作用域内
// int j = Color::RED; // 错误,没有隐式转换 // 如果需要显式转换,可以这样做:
unsigned int k = static_cast<unsigned int>(Color::RED);
在上面的例子中,Color
是一个枚举类,它的底层类型被指定为 unsigned int
(虽然这是可选的,如果不指定,则默认为 int
)。使用 Color::RED
来引用枚举值,并且由于类型安全性的提高,RED
不能隐式地转换为其他类型(如 int
)。
枚举类的优点
- 类型安全:枚举类提供了更好的类型安全性,因为它们不会隐式地转换为其他类型。
- 作用域控制:枚举值的作用域被限制在枚举类内部,这有助于减少命名冲突。
- 底层类型控制:可以指定枚举类的底层类型(如
unsigned int
、char
等)。 - 可读性和可维护性:使用枚举类可以使代码更具可读性和可维护性,因为它们提供了更清晰的意图和限制。
#include <iostream> enum class Color : unsigned char { RED, GREEN, BLUE }; void printColor(Color c) { switch (c) { case Color::RED: std::cout << "Red\n"; break; case Color::GREEN: std::cout << "Green\n"; break; case Color::BLUE: std::cout << "Blue\n"; break; default: std::cout << "Unknown color\n"; break; }
} int main() { Color c = Color::RED; printColor(c); // 输出 "Red" return 0;
}