enum class 提供强类型和作用域隔离,解决传统枚举的命名冲突与隐式转换问题。其成员需通过 枚举类型::成员 访问,禁止隐式转为整数,提升类型安全。默认底层类型为 int,可显式指定如 :unsigned char 以优化内存或对接C接口。转换为整数需 static_cast,确保意图明确,避免误用。支持前向声明,利于大型项目解耦。几乎所有现代C++场景都应优先使用 enum class,以增强代码清晰性、可维护性和安全性。

用
enum class
C++11引入的
enum class
enum
class
例如:
#include <iostream>
// 定义一个强类型枚举
enum class TrafficLight {
Red, // 默认值从0开始,依次递增
Yellow,
Green
};
void processLight(TrafficLight light) {
// 必须使用完全限定名来访问枚举成员
if (light == TrafficLight::Red) {
std::cout << "Stop!" << std::endl;
} else if (light == TrafficLight::Green) {
std::cout << "Go!" << std::endl;
} else {
std::cout << "Prepare to stop or go." << std::endl;
}
}
int main() {
TrafficLight currentLight = TrafficLight::Red;
processLight(currentLight);
// 尝试隐式转换为int会报错,这正是enum class的优点
// int x = TrafficLight::Red; // 编译错误!
// 如果确实需要转换为底层类型(默认是int),必须显式转换
int redValue = static_cast<int>(TrafficLight::Red);
std::cout << "Red value as int: " << redValue << std::endl;
// 枚举成员不会污染当前作用域
// Red; // 编译错误,Red不在当前作用域
return 0;
}可以看到,
enum class
枚举类型名::成员名
立即学习“C++免费学习笔记(深入)”;
enum class
enum
这是个好问题,也是理解
enum class
enum
enum class
首先是作用域。传统
enum
enum Color { Red, Green };Color
Red
Green
enum Status { Red, Blue };Red
enum class
Color::Red
Status::Red
其次是类型安全性和隐式转换。这是我个人觉得
enum class
enum
Color::Red
int
enum class
int
char
static_cast
再来是底层类型。传统
enum
int
short
enum class
int
enum class Flags : unsigned char { ... };最后,一个比较实用的点是前向声明。传统
enum
enum class
enum class MyState : int;
enum class
指定
enum class
enum class
例如,如果你想让枚举值只占用一个字节,可以这样写:
#include <iostream>
enum class LogLevel : unsigned char {
Debug = 0,
Info = 1,
Warning = 2,
Error = 3,
Critical = 4
};
int main() {
LogLevel level = LogLevel::Warning;
// 获取枚举值的底层整数表示
unsigned char rawValue = static_cast<unsigned char>(level);
std::cout << "Log level raw value: " << static_cast<int>(rawValue) << std::endl; // 打印整数值
// 即使是负数,只要在指定类型范围内也可以
enum class StatusCode : short {
Ok = 0,
NotFound = 404,
InternalError = 500,
Unknown = -1 // 可以包含负值,只要在short范围内
};
StatusCode status = StatusCode::Unknown;
std::cout << "Status code: " << static_cast<short>(status) << std::endl;
return 0;
}可以看到,指定底层类型很简单,这在内存优化、与C语言API交互(比如C库函数可能返回一个
int
至于类型转换,前面也提到了,
enum class
static_cast<目标类型>(枚举值)
反过来,你也可以将一个整数值
static_cast
enum class
#include <iostream>
enum class ErrorCode : int {
Success = 0,
FileNotFound = 1,
PermissionDenied = 2
};
void processErrorCode(int code) {
// 将整数转换为强类型枚举
// 注意:这里需要你确保code的值是有效的枚举值,否则可能导致逻辑错误
ErrorCode err = static_cast<ErrorCode>(code);
if (err == ErrorCode::Success) {
std::cout << "Operation successful." << std::endl;
} else if (err == ErrorCode::FileNotFound) {
std::cout << "Error: File not found." << std::endl;
} else {
std::cout << "Unknown error or permission denied." << std::endl;
}
}
int main() {
processErrorCode(0); // Success
processErrorCode(1); // File not found
processErrorCode(99); // Unknown error - 这里没有定义99,但可以转换
return 0;
}这种显式转换的强制性,虽然初看起来有点麻烦,但它实际上是在帮助你编写更安全、更易于理解和维护的代码。
enum class
说实话,几乎所有情况下都应该优先选择
enum class
enum class
首先,在API设计中,
enum class
Color
int
其次,在大型项目里,防止命名冲突是家常便饭。随着代码库的膨胀,不同模块或库中可能会定义相同名称的枚举成员。
enum class
ModuleA::State::Running
ModuleB::State::Running
再者,它极大地提升了代码的可读性和可维护性。
TrafficLight::Red
Red
Red
TrafficLight
最后,即便
enum class
enum
constexpr
|
|
所以,总结来说,如果你在写现代C++代码,并且关心类型安全、代码清晰度、可维护性以及避免潜在的bug,那么
enum class
以上就是C++枚举类型怎么用 enum class强类型枚举的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号