为什么要有枚举类?
在C++11标准之前,枚举类型(enum
)是C++语言中的一种基本数据类型,它允许为整数值赋予有意义的名称。然而,传统枚举存在一些问题,比如枚举成员的类型是int
,这导致它们可以隐式转换为整数。另外,同名枚举成员存在冲突。
什么是枚举类?
C++11引入了强类型枚举(strongly-typed enums),也称为枚举类(enum classes)。它们与传统的C++枚举(enum)相比,提供了更好的类型安全和代码的可读性。强类型枚举的值不属于其枚举类型的转换作用域,这意味着它们不会自动转换为整数类型,也不会与整数类型自动比较。
枚举类的特点
- 类型安全:强类型枚举不允许隐式转换为整数类型或其他枚举类型。
- 作用域限制:枚举成员的作用域被限制在枚举类内部,这意味着它们不会与外部作用域的同名枚举成员冲突。
- 底层类型指定:可以指定强类型枚举的底层类型(如int, unsigned int等),如果不指定,则默认为int。
示例代码
#include <iostream>
// 定义一个强类型枚举
enum class Color {
Red, // 默认为0
Green, // 默认为1
Blue // 默认为2
};
// 定义一个带有底层类型的强类型枚举
enum class StatusCode : int {
Ok = 200, // 显式赋值为200
NotFound = 404
};
int main() {
// 使用强类型枚举
Color c = Color::Red;
// 尝试隐式转换为整数,编译错误
// int i = c;
// 显式转换为整数
int i = static_cast<int>(c);
std::cout << "Color Red as int: " << i << std::endl;
// 使用作用域限定符访问枚举成员
StatusCode status = StatusCode::NotFound;
std::cout << "Status Code NotFound: " << static_cast<int>(status) << std::endl;
// 枚举成员与整数的比较
if (status == static_cast<StatusCode>(404)) {
std::cout << "Status Code is NotFound." << std::endl;
}
return 0;
}