枚举类型enum
C++中,枚举类型(enumeration) 是一个被命名的整型常量的集合。和类一样,每个枚举类型定义了一种新的类型。枚举属于字面值常量类型。C++包含两种枚举:限定作用域的和不限定作用域的。
限定作用域的枚举类型
限定作用域的枚举类型(scoped enumeration)定义形式如下:
enum class open_modes {input, output, append};
首先是关键字enum class(或者是等价的使用enum struct),随后是枚举类型名字以及用花括号括起来的以逗号分隔的枚举成员(enumerator),最后加上分号。上面的函数定义了一个名为open_modes的枚举类型,它包含三个枚举成员:input、output、append。
不限定作用域的枚举类型
不限定作用域的枚举类型(unscoped enumeration)定义时省略掉关键字class(或struct),枚举类型的名字是可选的,如果enum是未命名的,则我们只能在定义该enum时定义它的对象。
enum color {red, yellow, green}; //不限定作用域的枚举类型
enmu {floatPrec = 6, doublePrec = 10, double_doublePrec = 10}; //未命名的、不限定作用域的枚举类型
枚举成员
作用域
在限定作用域的枚举类型中,枚举成员遵循常规的作用域准则,并且在枚举类型的作用域外是不可访问的。与之相反,在不限定作用域的枚举类型中,枚举成员的作用域与枚举本身的作用域相同:
enum color {red, yellow, green}; //正确,不限定作用域的枚举类型
enum stoplight {red, yellow, green}; //错误,重复定义了枚举成员
enum class peppers {red, yellow, green}; //正确,枚举成员被隐藏了
color eyes = green; //正确,不限定作用域的枚举类型的枚举成员位于有效的作用域中
peppers p = green; //错误,peppers的枚举成员不在有效的作用域中,color::green在有效的作用域中,但是类型错误
color hair = color::red; //正确,允许显示的访问枚举成员
peppers p2 = peppers::red; //正确,使用peppers的red
枚举值
默认情况下,枚举值从0开始,依次加1。不过我们也能为一个或几个枚举成员指定专门的值,并且枚举值不一定唯一。
enum class intTypes {
charTyp = 8, shortTyp = 16, intTyp = 16, longTyp = 32, long_longTyp = 64
};
枚举成员是const,因此在初始化枚举成员时提供的初始值必须是常量表达式。