本文主要是介绍C++基础整理(9)之强枚举类,enum class的意义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
C++基础整理(9)之强枚举类,enum class的意义
注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构
C++ 的 强枚举
- C++基础整理(9)之强枚举类,enum class的意义
- 一、强枚举(enum class)
- 1、基本语法
- 2、特性与优点
- 3、注意事项
- 二、回顾普通的枚举enum
- 1、传统枚举(enum)
- 总结
提示:本文为 C++ 中 强枚举类定义、写法和举例
一、强枚举(enum class)
enum class 是 C++11 引入的一种强类型枚举(也称为作用域枚举或类枚举),它提供了一种更安全、更易于管理的枚举类型。与传统的 enum 相比,enum class 提供了更好的类型安全和更清晰的作用域规则。强类型枚举不会隐式转换为整数或其他类型,需要使用显式的类型转换。同时,枚举器的名称也只在枚举类型的作用域内可见。
1、基本语法
enum class Color { RED, GREEN, BLUE
};
2、特性与优点
类型安全:enum class 枚举类型的值不会隐式地转换为整数或其他枚举类型。如果需要转换,必须显式地进行。这有助于防止意外的类型转换错误。
Color c = Color::RED;
int i = static_cast<int>(c); // 显式转换
作用域明确:enum class 的枚举器(即枚举值)具有明确的作用域,需要使用枚举类型名和作用域解析运算符 :: 来访问。这避免了名称冲突,并使得代码更加清晰。
Color c = Color::RED; // 正确
Color d = RED; // 错误,因为 RED 不在当前作用域中
更好的底层类型控制:你可以为 enum class 指定底层类型(用一个:),以控制枚举值的存储大小和范围。
enum class Color : uint8_t { //指定底层类RED, GREEN, BLUE
};
可前向声明:与传统的 enum 不同,enum class 可以被前向声明,这使得它可以在头文件中仅声明而在源文件中定义,从而实现更好的模块化和封装。
// 头文件
enum class Color; // 源文件
enum class Color { RED, GREEN, BLUE
};
更好的调试体验:在调试器中,enum class 的值通常会显示为它们的名称,而不是整数,这使得调试更加直观。
3、注意事项
由于 enum class 提供了更强的类型安全性,因此与传统的 enum 相比,使用它时可能会需要更多的显式转换。
在某些情况下,如果你需要枚举值与整数之间的隐式转换,或者需要在多个枚举类型之间共享枚举值,那么传统的 enum 可能更合适。
二、回顾普通的枚举enum
1、传统枚举(enum)
传统枚举在C++98及之前的版本中定义,它们允许隐式转换为整数,并且枚举器的名称在枚举类型的作用域内是可见的。
enum Color { RED, GREEN, BLUE }; int main() { Color c = RED; // 正确 int i = c; // 隐式转换为整数,也是正确的 Color d = 2; // 也是正确的,但可能不是期望的行为 return 0;
}
由于传统枚举可以隐式转换为整数,并且整数也可以隐式转换为枚举类型(只要整数值在枚举值的范围内),这可能导致意外的类型转换和难以追踪的错误。
总结
这篇关于C++基础整理(9)之强枚举类,enum class的意义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!