enum强化

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;
}
发布了78 篇原创文章 · 获赞 16 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/zeqi1991/article/details/92838957