enum是非域化枚举
例:
enum color{Red};
enum color2{Red};//err
1.新增枚举成员
enum在声明时,编译器会选择占用内存最小的一种潜在类型 (underlying types),来代表每一个枚举
成员
例:
enum color{Red};
缺点
当新增一个枚举成员时 (如下 audited ),整个系统将会被重新编译一遍,即使只
有一个很简单的函数使用了新加的枚举成员 (audited)
+class使其成为域化枚举
1.防止命名空间污染
例:
enum color{Red};
enum class color{Red};//ok
2.强类型枚举
非域化的枚举成员,可以隐式的转换为广义整型
域化的枚举成员,不可以隐式的转换为广义整型
3.前置声明
enum class支持前置声明,即不用初始化枚举成员,声明一个枚举类型
例:
enum class color;
4.新增枚举成员
当新增枚举成员时,包含这些声明的头文件并不需要重新编译,源文件则根据新枚举
成员的使用情况来决定是否重新编译:新成员没被使用则不需要哦重新编译
5.潜在类型
enum class 的潜在类型 (underlying type),缺省为 int 型,当然也可自定义潜在类型。无论哪种方式,
编译器都会预先知道枚举成员的大小
区别
1)C++98 的 enum 是“非域化的”;而 C++11 的 enum class 是“域化的”,限制了枚举成员只在域内可见
2) enum class 的缺省潜在类型 (underlying type) 是 int 型,而 enum 没有缺省潜在类型
3) enum class 一般总是前置声明,而 enum 只有在指定了潜在类型时才可以是前置声明