C++11 强类型枚举
【1】枚举:分门别类与数值的名字
当程序中需要“数值的名字”时,通常有三种方式实现:
(1)宏
1 #define Male (0) 2 #define Female (1)
缺点:如果代码中右Male或者Femal字符串,在预处理阶段一律替换,干扰正常代码。
(2)匿名的enum
enum { Male, Female };
优点:a. 编译期检查;b. 相比于宏,不会干扰正常代码
缺点:见下节
(3)静态常量
1 const static int Male = 0; 2 const static int Female = 1;
优点:a. 编译期检查;b. 作用域局限于文件内;
缺点:相比于enum,编译器可能会为Male和Female在目标代码中产生实际的数据,会增加存储空间。
【2】有缺陷的枚举类型
旧版enum存在的问题:
(1)向整型的隐式转换
(2)无法指定底层所使用的数据类型
(3)enum的作用域。比如无法定义同名的枚举成员
(4)不同编译器解决该问题的方法不统一。削弱了可移植性。
【3】强类型枚举
强类型枚举特点:
(1)声明方式。enum class 与 enum struct等价
(2)强作用域。强类型枚举成员的名称不会被输出到其父作用域,所以不同枚举类型定义同名枚举成员编译不会出现重定义错误。
同时使用枚举类型的枚举成员时,必须指明所属范围,单独的枚举成员名则不再具有意义。
(3)限制转换。强类型枚举成员的值不可以与整型发生相互隐式转换。
(4)可以指定底层类型。强类型枚举默认的底层类型是int,但也可以显式地指定底层类型。
(5)不可声明匿名强类型枚举。由于强类型枚举是强类型作用域的,故匿名的enum class可能什么都做不了,匿名强类型枚举会编译报错。
示例如下:
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <map> 5 using namespace std; 6 7 // C++11引入了一种新的枚举类型,即“枚举类”,又称“强类型枚举”。声明请类型枚举非常简单,只需要在enum后加上使用class或struct。 8 enum Old { Yes, No }; // old style 9 enum class New1 { Yes, No }; // new style 10 enum struct New2 { Yes, No }; // new style 11 12 int main() 13 { 14 /** 15 *“传统”的C++枚举类型有一些缺点: 16 */ 17 enum Status1 { Ok, Error }; 18 // enum Status2{Ok, Error}; // error:导致命名冲突, Status1已经有成员叫Ok, Error 19 20 // 在C++11中,强类型枚举解决了这些问题 21 enum class StatusN1 { Ok, Error }; 22 enum struct StatusN2 { Ok, Error }; 23 // enum class { Wang, Liu, Sun, Zhao }; // error:匿名强类型枚举编译报错 24 25 // StatusN1 flagN1 = Ok; // error:必须使用强类型名称 26 StatusN2 flagN2 = StatusN2::Ok; 27 28 enum class C : char { C1 = 1, C2 = 2 }; // 指定枚举的底层数据类型char 29 enum class D : unsigned int { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U }; 30 cout << sizeof(C::C1) << endl; // 1 31 cout << sizeof(D::E1) << endl; // 4 32 cout << sizeof(D::Ebig) << endl; // 4 33 34 system("pause"); 35 }
如上所述。
【4】原枚举类型的扩展
C++11对传统枚举类型进行了扩展:
(1)可指定底层基本类型。如请类型枚举,应用比如:
enum Type : char { Low, Middle, High };
(2)从C++11后,枚举类型的成员可以在枚举类型的作用域内有效。比如:
1 enum Type { Low, Middle, High }; 2 Type type1 = Middle; 3 Type type2 = Type::Middle;
其中Middle与Type::Middle都是合法的使用形式。
good good study, day day up.
顺序 选择 循环 总结