3.8.3 用enum提高程序清晰度

枚举数据类型是把名字和数字相联系的一种方式,从而对阅读代码的任何人给出更多的含义。enum关键字(来自C)通过为所给出的任何标识符表赋值0、1、2等值来自动地列举出它们。也可以声明enum变量(它们总是表示为整数值)。enum的声明和struct的声明很相似。

当想明了某种特征时,枚举数据类型是很有用的:

3.8.3 用enum提高程序清晰度 - 图1

3.8.3 用enum提高程序清晰度 - 图2

shape是被列举的数据类型ShapeType的变量,可以把它的值和列举的值相比较。因为shape实际上只是int,所以它可以具有任何一个int拥有的值(包括负数)。也可以把int变量和枚举值比较。

读者可能意识到上面的类型转换例子对于程序有可能是一种值得怀疑的方式。C++对这类程序有一种更好的编码方式,对它的解释在本书的后面介绍。

如果不喜欢编译器赋值的方式,可以自己做,如:

3.8.3 用enum提高程序清晰度 - 图3

如果对某些名字赋给值,对其他的不赋给值,编译器会使用相邻的下一个整数值。例如,

3.8.3 用enum提高程序清晰度 - 图4

编译器会把值26赋给pop。

使用枚举数据类型时,增强了代码的可读性。然而,在某种程度上,这只是试图(在C中)实现在C++中用类可以做到的事,所以在C++中很少看到使用enum。

3.8.3.1 枚举类型检查

C的枚举相当简单,只是把整数值和名字联系起来,但它们并不提供类型检查。在C++中,正如现在希望的那样,类型的概念是基础,对于枚举也是如此。当创建一个命名的枚举时,就像使用类一样有效地创建了一个新类型。在单元翻译期间,枚举名成为保留字。

此外,在C++中对枚举的类型检查比在C中更为严格。如果有一个color枚举类型的实例a,我们就会特别注意到这个。在C中,可以写a++,但在C++中不能这样写。这是因为枚举的增量运算执行两种类型转换,其中一个在C++中是合法的,另一个是不合法的。首先,枚举的值隐式地从color强制转换为int,然后递增该值,再把int强制转换回color类型。在C++中,这是不允许的,因为color是一个独特的类型,并不等价于一个int。这一点是有意义的,因为我们怎么能知道在颜色表中blue的增量值会是什么?如果想对color进行增量运算,则它应该是一个类(按照增量运算)而不是一个enum,成为一个类会更安全。任何时候写代码对enum类型进行隐式转换,编译器都会标记这是一个危险活动。

在C++中,联合(在下面描述)有很相似的附加类型检查。