快速理解C++中的enum class
快速理解C++中的enum class
什么是enum class?
enum class
是C++11引入的强类型枚举,它比传统enum更安全好用。主要解决两个问题:
- 命名冲突:传统enum的成员像全局变量,不同enum的同名成员会冲突
2.乱用数字:传统enum可以和整数随便转换,容易出错
举个栗子🌰
// 传统enum
enum Color { Red, Green }; // 直接访问Red
enum Light { Red, Blue }; // ❌ 编译错误,Red重复了!
// enum class
enum class NewColor { Red, Green }; // 必须写NewColor::Red
enum class NewLight { Red, Blue }; // ✅ 完全没问题
怎么把数字转成enum class?
方法1:直接转换(有风险)
int num = 1;
auto color = static_cast<NewColor>(num); // 可能得到不存在的值!
⚠️ 如果num不在枚举范围内(比如传了3),程序可能崩溃
方法2:安全转换(推荐)
NewColor SafeConvert(int value) {
switch(value) {
case 0: return NewColor::Red;
case 1: return NewColor::Green;
default: throw "无效颜色"; // 发现非法值及时报错
}
}
✅ 会检查数字是否合法,就像超市收银员会检查商品条形码对不对
enum class的三大优势
特点 | 传统enum | enum class |
---|---|---|
起名字 | 全局命名(容易重名) | 需要加前缀(如Color::Red) |
转数字 | 自动转换(可能出错) | 必须用static_cast |
指定存储类型 | 不能指定 | 可以省内存(如用char) |
省内存示例
enum class Month : char { // 用1字节存储
Jan=1, Feb, Mar, // 显式指定数字
Apr, May, Jun,
Jul, Aug, Sep,
Oct, Nov, Dec
};
什么时候用?
👉 优先用enum class!除非:
- 要和C语言代码交互
- 需要自动转数字的场景(比如处理老代码)
简单记:新项目都用enum class,就像现在都用智能手机而不是老式座机📱
- : 转换安全注意事项(网页2)
- 核心区别对比(网页6)
- 内存优化方法(网页7)