在C++11及以后的版本中,引入了枚举类(也称为强类型枚举或作用域枚举),这是对传统枚举(C风格枚举)的一个改进。枚举类提供了更好的类型安全和作用域控制。
传统枚举在C++中类似于整数类型,但它们限制了可以赋给变量的值的集合。然而,它们没有类型安全性,并且它们的枚举值隐式地转换为整数。
- enum Color { RED, GREEN, BLUE };
- Color c = RED; // 没问题
- int i = RED; // 隐式转换,也没有问题
枚举类提供了更严格的类型检查和更好的作用域控制。枚举类类型不会隐式地转换为其他类型(除了用户定义的显式转换),并且枚举值的作用域被限制在枚举类内部。
- 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
-
- 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;
- }