enum
文章目录
enum枚举
C++的enum工具提供了一种创建符号常量的方式,这种方式可以替代const
枚举类型定义用关键字enum标识
cpp
enum 标识符
{
枚举数据表
};
- 枚举数据表的值都是整数。第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。也可以人为设定枚举成员的值,从而自定义某个范围内的整数。
- 可以在定义类型时对枚举常量初始化。
- 枚举类型可以进行比较。
cpp
//Mon的值为1,Tue的值为2,Wed的值为3 ...
enum week {Mon=1,Tue,Wed,Thu,Fri,Sat,Sun};
enum Level {
UNKNOW = 0,
DEBUG = 1,
INFO = 2,
WARN = 3,
ERROR = 4,
FATAL = 5
};
- Mon,Tue,Wed这些常量被称为枚举量
枚举量可以直接当作define用
cpp
printf("%d",Tue);
枚举变量
cpp
enum Month {Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,dec};
//a即为枚举变量
//只能将定义枚举时使用的枚举量赋值给枚举变量
enum Month a = Feb;
强类型枚举
- 非强类型枚举的缺陷
cpp
- 1.当两个枚举内的成员相同时,由于该成员是全局的,故在使用时会造成混淆,报错;
namespace T {
enum Type { General, Light, Medium, Heavy };
}
namespace {
enum Category{ General = 1, Pistol, MachienGun, Cannon };
}
int main() {
T::Type t = T::Light;
if(t == General) {// 此处若没有使用T::General,则将会使用上述全局的General
cout << "-----" << endl;
}
return 0;
}
- 2.枚举成员总是阔以被隐式转换为整型
- 解决方法
cpp
C++11采用强类型枚举,在enum后加上一个class;
- 强作用域,不会被输出到父作用域;
- 转化限制,不能被隐式转换,比较需要通过显示转换;
- 可以指定底层类型,在枚举名称后加上`: type`,type不能为wchar_t;
cpp
/** 使用强枚举,并指定类型 */
enum class Type : char { General, Light, Medium, Heavy };
enum class Category { General = 1, Pistol, MachienGun, Cannon };
void test() {
Type t = Type::Light;
t = General; // 错误,需要指定名称
if (t == Category::General) {} // 错误,不同类型不能比较
if (t == Type::Light) {}
if((int)t > 0) {} // 强制转换
}
--