enum 是 C++ 中的枚举类型,用于定义一组具名常量。枚举类型可以提高代码的可读性和可维护性,使得一组相关常量具有明确的命名空间和类型检查。C++ 支持两种类型的枚举:传统的枚举(enum)和强类型枚举(enum class)。
传统枚举(enum)
定义和使用
传统枚举使用关键字 enum 来定义一组具名整数常量。其基本语法如下:
enum EnumName {
Enumerator1,
Enumerator2,
Enumerator3,
// ...
};
示例
#include <iostream>
enum Color {
RED, // 默认情况下,枚举值从0开始,依次递增
GREEN,
BLUE
};
int main() {
Color myColor = RED;
std::cout << "myColor: " << myColor << std::endl; // 输出0
return 0;
}
特点
枚举值默认从 0 开始,依次递增。
可以显式指定枚举值。
enum Color {
RED = 1,
GREEN = 3,
BLUE = 5
};
枚举值在其命名空间中是全局的,因此不同的枚举类型中不能有相同的枚举值名称。
强类型枚举(enum class)
C++11 引入了强类型枚举(enum class),它具有更强的类型安全性和作用域控制。
定义和使用
强类型枚举使用关键字 enum class 来定义。其基本语法如下:
enum class EnumName {
Enumerator1,
Enumerator2,
Enumerator3,
// ...
};
示例
#include <iostream>
enum class Color {
RED,
GREEN,
BLUE
};
int main() {
Color myColor = Color::RED;
// std::cout << "myColor: " << myColor << std::endl; // 错误,不能直接输出枚举类对象
std::cout << "myColor: " << static_cast<int>(myColor) << std::endl; // 输出0
return 0;
}
特点
枚举值在其作用域内,因此不同枚举类型可以有相同的枚举值名称。
需要显式转换才能将枚举值转换为整数类型。
默认情况下,枚举值从 0 开始,依次递增。
总结
传统枚举 vs 强类型枚举
特性 传统枚举 (enum) 强类型枚举 (enum class)
命名空间 全局命名空间 枚举类型自己的命名空间
类型安全性 较弱 强
整数转换 隐式转换 需要显式转换
可重复的枚举值名称 否 是
详细示例
#include <iostream>
enum Color {
RED, // 0
GREEN, // 1
BLUE // 2
};
enum class NewColor {
RED, // 0
GREEN, // 1
BLUE // 2
};
enum class TrafficLight {
RED = 1,
YELLOW = 2,
GREEN = 3
};
int main() {
// 传统枚举
Color c = GREEN;
std::cout << "Color GREEN value: " << c << std::endl;
// 强类型枚举
NewColor nc = NewColor::GREEN;
// std::cout << "NewColor GREEN value: " << nc << std::endl; // 错误,不能直接输出
std::cout << "NewColor GREEN value: " << static_cast<int>(nc) << std::endl;
// 枚举类
TrafficLight light = TrafficLight::RED;
std::cout << "TrafficLight RED value: " << static_cast<int>(light) << std::endl;
return 0;
}
这个例子展示了如何定义和使用传统枚举和强类型枚举,以及它们之间的主要区别。