enum类型
enum类型是一个c/c++的基本类型,它基于c,并在c++上继续使用,c++11在此基础上做了个更好的努力
当程序中需要使用特定数值的时候,一般会采用3种方式来实现
- 宏定义
#define MALE 0
#define Female 1
缺点在于它只是预处理阶段的名字,预处理过程中会将代码中MALE,Female全部做替换0或者1,那么有时候会干扰正常代码
- 匿名enum
enum {Male, Female};
编译期的名字,会得到编译器的检查,并且相比宏定义,它不会干扰代码
- 静态常量
const static int Male = 0;
const static int Female = 1;
有缺陷的enum
- 具名enum类型的名字和成员的名字都是全局可见的
如果代码中出现两个enum类型,并且有同一个类型名
enum Type{General, Light, Medium, Heavy};
enum Category(General, Pistol, MachineGun, Canon);
Type::General和Category::General都是全局名,会导致编译报错
- 在对enum变量进行比较时,都会隐式提升到int类型,进行比较
enum Type{General, Light, Medium, Heavy};
enum Category(Pistol, MachineGun, Canon);
if (Type::General < Category::Pistol)
{
//这种比较是没意义的,但是编译器不会禁止
}
C++11对enum进行了增强
- 强作用域,强类型枚举成员的名称不会被输出到父作用域空间
- 转换限制,不会隐式转换int
- 可以指定底层类型 例如:
enum class Type : char{General, Light};
//新的enum格式写法
//除了wchar_t 不能指定
使用匿名enum的时候,会出现的问题
enum class {General, Light, Medium, Heavy} weapon;
int main()
{
weapon = General; //error
weapon == weapon::General; //error
return 0;
}