本文是C++11新特性介绍的第十二部分,涉及到枚举相关的新特性。
枚举类型定义
若一个变量只有有限的几种可能,我们可以定义枚举(enumeration)类型,比如一个星期中取值范围只能是星期一至星期日,性别的分类只能有男或女。
默认情况下,枚举成员值从0开始,其后的枚举成员值以依次1。我们也可以显示指定枚举成员值,则其后的枚举成员值在指定的成员值依次加1。枚举成员值必须是常量表达式。
在C++11新标准中引入了限定作用域的枚举类型(enum class),所以在C++11中枚举类型可分为不限定作用域(enum)以及限定作用域(enum class)两种。在限定作用域的enum class中,枚举成员的作用域限定在枚举类型所声明的作用域中,所以当某个更大的作用域中包含enum class则该enum class中的枚举成员的作用域也只限定在该enum class中。
本文章只简单介绍限定作用域的枚举类型(enum class)。
enum class
限定作用域枚举的一般形式如下:
形式1,声明枚举成员类型为int的有作用域枚举类型:
|
|
形式2,声明枚举成员类型为类型的有作用域枚举类型:
|
|
形式3,声明枚举成员类型为int的有作用域枚举类型的不可见枚举声明:
|
|
形式4,声明枚举成员类型为类型的有作用域枚举类型的不可见枚举声明:
|
|
注意关键字 enum class 与 enum struct完全等价,所以上述所有形式中的enum class 可由 enum struct替代,例如下列形式等价于形式1:
|
|
举例:
enum class与enum区别
在限定作用域的枚举类型中,枚举成员的名字遵循常规的作用域准则,并且在枚举类型的作用域外是不可访问的。与之相反,在不限定作用域的枚举类型中,枚举成员的作用域与枚举类型本身的作用域相同。
避免枚举成员重定义
enum class的中的枚举成员作用域的范围只限定在enum class声明的作用域中,所以在包含enum class的更大的作用域就可以定义一个与枚举成员变量名相同的变量,降低了对命名空间名的污染:
|
|
|
|
|
|
避免隐式转换
不限范围的枚举类enum是可以发生隐式转换的,限定作用域的枚举类型enum class不允许任何隐式转化,可以显示或使用static_cast进行强制转换:
声明前置
在C++11标准中,enum class的枚举类型可以提前声明,因为枚举成员可以使用默认成员类型int,也可以按编程需要修改默认成员类型。而enum未指定枚举成员默认大小,所以必须指定成员类型:
总结
1.enum class是限定作用域枚举类型,枚举成员的作用域限定在枚举类型所声明的作用域中。
2.enum class不允许任何隐式转化,但可以显示或使用static_cast进行强制转换。
3.enum class可以前置声明默认枚举成员是int,enum本身没有默认枚举成员默认类型,但可以指定枚举成员默认类型从而可以前置声明。