1.介绍
enum class是C++11引入的有作用域的枚举类型。与传统的enum不同,enum class的枚举值不会隐式转化为整数,也不会污染全局命名空间。必须通过作用域解析运算符(::)来访问枚举值。
2.enum class的用法
enum class KeyMode: int
{
NORMAL = 1,
VIM
};
enum class:关键字,写在最前边。
KeyMode:这是枚举类型的名称。
:int:指定枚举的底层类型。这里是int,意味着枚举值在内存中以int类型存储。你也可以指定其他的底层类型,例如 char 、float等。
枚举值:第一个枚举值被显式设置为1,第二个枚举值被隐式设置为2。
示例:
#include <iostream>
enum class KeyMode : int
{
NORMAL = 1,
VIM
};
int main() {
// 定义一个 KeyMode 类型的变量
KeyMode mode = KeyMode::NORMAL;
// 使用枚举值进行判断
if (mode == KeyMode::NORMAL) {
std::cout << "Normal mode is active." << std::endl;
}
// 访问枚举值的底层整数值
std::cout << "Value of mode: " << static_cast<int>(mode) << std::endl;
return 0;
}
输出为
Normal mode is active.
Value of mode: 1
3.特点
(1)作用域访问:枚举值必须通过KeyMode::NORMAL这样的方式访问,避免了传统enum的全局命名空间污染问题。
(2)类型安全:enum class 不会隐式转换为整数,避免了潜在的错误。如果需要转化为整数,必须显示使用static_cast<int>。
(3)底层类型:通过: int指定底层类型为int,但可以根据需要改成其他类型。
(4)枚举值的初始化:可以显示指定枚举值的整数值,也可以让编译器自动分配。
4.与传统enum的区别
特点 | enum class(C++11) | enum(传统C-style) |
作用域 | 有作用域(必须使用::访问) | 无作用域(全局可见) |
隐式转换 | 不会隐式转换为整数 | 运行隐式转换为整数 |
底层类型 | 可以指定底层类型 | 底层类型由编译器决定 |
命名冲突 | 不会污染全局命名空间 | 可能污染全局命名空间 |
5.总结
enum class是C++11引入的一种强类型、有作用域的枚举类型。它的设计更加安全和清晰,更符合现代C++编程。
如有错误,敬请指正!!!