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.

顺序 选择 循环 总结

posted @ 2020-01-31 18:36  kaizenly  阅读(1239)  评论(0编辑  收藏  举报
打赏