enum class 比 enum 更安全,避免命名冲突、禁止隐式转换、支持底层类型指定,推荐用于现代C++。

在C++中,enum 和 enum class(也称为强类型枚举)虽然都用于定义枚举类型,但它们在作用域、类型安全和隐式转换方面有显著区别。C++11引入的 enum class 解决了传统 enum 的一些缺陷,更适合现代C++编程。
传统 enum 的枚举值会暴露在其定义的作用域中,容易造成名称冲突。
示例:
enum Color { Red, Green, Blue };
enum Status { Red = 1, Ok }; // 错误:Red 重复定义
而 enum class 的枚举值被限定在枚举类型的作用域内,必须通过作用域操作符访问,避免命名冲突。
enum class Color { Red, Green, Blue };
enum class Status { Red, Ok };
Color c = Color::Red; // 正确
Status s = Status::Red; // 不冲突
普通 enum 的枚举值会隐式转换为整数,可能导致意外的比较或运算。
立即学习“C++免费学习笔记(深入)”;
enum Color { Red, Green };
enum Size { Small, Large };
if (Red == Small) { } // 合法但逻辑错误,编译器不报错
enum class 禁止隐式转换到整数或其他类型,增强了类型安全。
enum class Color { Red, Green };
enum class Size { Small, Large };
// if (Color::Red == Size::Small) // 编译错误:不能直接比较
// int x = Color::Red; // 错误:不能隐式转为int
int y = static_cast<int>(Color::Red); // 必须显式转换
两者都支持指定底层存储类型,但 enum class 更常使用这一特性来控制内存布局和序列化行为。
enum class Priority : uint8_t { Low, Medium, High };
enum class Code : int { Success = 0, Error = -1 };
这使得你可以明确控制枚举占用的空间,比如用 uint8_t 节省内存,适用于嵌入式或性能敏感场景。
基本上就这些。enum class 是对传统 enum 的现代化改进,提供了更好的封装性和类型检查,是C++11之后首选的枚举定义方式。
以上就是C++ enum与enum class的区别_C++11强类型枚举使用指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号