除了类之外,C++还提供了另一种简单形式的用户自定义类型,使得我们可以枚举一系列值:
enum class Color{red,blue,green};enum class Traffic_light{green,yellow,red};Color col=Color::red;Traffic_light light=Traffic_light::red;
其中枚举值(如red)位于其 enum class的作用域之内,因此我们可以在不同的enum class中重复使用这些枚举值而不致引起混淆。例如, Color::red是指 Color的red,它与Traffic light:red显然不同。
枚举类型常用于描述规模较小的整数值集合。通过使用有指代意义的(且易于记忆的)枚举值名字可提高代码的可读性,降低出错的风险。
enum后面的 class指明了枚举是强类型的,且它的枚举值位于指定的作用域中。不同的 enum class是不同的类型,这有助于防止对常量的意外误用。在上面的例子中,我们不能混用 Traffic light和 Color的值:
Color x=red; //错误:哪个red?Color y= Traffic_light::red; //错误:这个red不是Color的对象Color z= Color::red; //OK
同样,我们也不能隐式地混用 Color和整数值:
int i= Color::red; //错误:Color::red不是一个intColor c=2; //错误:2不是一个 Color对象
如果你不想显式地限定枚举值名字,并且希望枚举值可以是int(无须显式转换),则应该去掉 enum class中的class而得到一个“普通的”enum(见8.4.2节)。
默认情况下, enum class只定义了赋值、初始化和比较(即==和<,见2.2.2节)操作。然而,既然枚举类型是一种用户自定义类型,那么我们就可以为它定义别的运算符:
Traffic_light& operator++(Traffic_light& t) //前置递增运算符++{switch(t){case Traffic_light::green: return t=Traffic_light::yellow;case Traffic_light::yellow: return t=Traffic_light::red;case Traffic_light::red: return t=Traffic_light::green;}}Traffic_light next=++light; //next变成了Traffic_light::green
C++也提供了次强类型的“普通的”enum(见8.4.2节)。
