【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 #include2 #include <string> 3 #include 4 #include
如上所述。
【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.
顺序 选择 循环 总结