c++ enum使用笔记
c++ enum使用笔记
- 1. 无作用域枚举 vs. 有作用域枚举
- 2. 枚举项的初始化规则
- 3. 指定底层类型
- 4. 类型转换规则
- 5. 枚举的声明与定义
- 6. 示例对比
- 无作用域枚举的潜在问题:
- 有作用域枚举的安全性:
- 总结
C++中的枚举(
enum
)是一种取值受限的特殊类型,分为
无作用域枚举和
有作用域枚举(C++11起)。以下是详细解释及示例:
1. 无作用域枚举 vs. 有作用域枚举
-
无作用域枚举(传统枚举):
枚举项直接暴露在外部作用域,可能导致命名冲突。enum Color { Red, Green, Blue }; // 定义 Color c = Red; // 直接访问枚举项
-
有作用域枚举(C++11起,
enum class
或enum struct
):
枚举项需通过枚举类型名访问,避免命名冲突。enum class Color { Red, Green, Blue }; // 定义 Color c = Color::Red; // 必须通过作用域访问
2. 枚举项的初始化规则
- 默认从0开始递增:
enum { A, B, C }; // A=0, B=1, C=2
- 可手动指定值,后续项自动递增:
enum HttpCode { OK=200, Created=201, Accepted=202, BadRequest=400 }; enum { X=5, Y, Z }; // X=5, Y=6, Z=7
3. 指定底层类型
- 控制枚举项的尺寸,默认类型为
int
(无作用域枚举)或可指定(有作用域枚举):enum Direction : char { Up, Down }; // 无作用域,底层类型为char enum class Packet : uint8_t { SYN, ACK }; // 有作用域,底层类型为uint8_t
4. 类型转换规则
-
无作用域枚举:
可隐式转换为整型,但整型需显式转换回枚举:Color c = Green; int i = c; // 隐式转换,i=1 c = static_cast<Color>(2); // 显式转换,c=Blue
-
有作用域枚举:
必须显式转换与整型互转:Color c = Color::Green; int i = static_cast<int>(c); // 显式转换,i=1 c = static_cast<Color>(2); // 显式转换,c=Color::Blue
5. 枚举的声明与定义
- 前向声明需指定底层类型(C++11起):
// 头文件中声明 enum class LogLevel : int; enum Direction : char; // 源文件中定义 enum class LogLevel : int { Debug, Info, Warning, Error }; enum Direction : char { Up, Down };
6. 示例对比
无作用域枚举的潜在问题:
enum Light { Red, Green };
enum Signal { Red, Yellow }; // 错误!Red重复定义
有作用域枚举的安全性:
enum class Light { Red, Green };
enum class Signal { Red, Yellow }; // 正确,作用域隔离
Light l = Light::Red; // 明确作用域
总结
- 无作用域枚举:简单但易命名冲突,隐式转整型。
- 有作用域枚举(推荐):类型安全,避免污染作用域,需显式转换。
- 底层类型:控制枚举项的存储大小,支持前向声明。
- 初始化:灵活指定值,适用于位掩码或特定编码场景。