为了揭开隐藏在枚举背后的秘密,让我们来举例说明。假如我们希望声明一些类型为weight的变量,
并且这些变量的值只局限于一个很小的范围内。我们可以按照下面的方式定义一个枚举:
enum weight { light, medium, heavy, very_heavy };
符号常量light、media、heavy和very_heavy用符号的形式表示了我们希望一个类型为weight的变量可以拥有的不同的值。现在我们可以声明一个类型为weight的变量:
weight w;
w = heavy;
cout << w;
读者根据以前的C经验应该知道,虽然枚举可以提高代码的可读性,但编译器实际上用整型值代替这些符号常量。这些整型值被称为枚举器(enumerator),它必须是整型常量。一般情况下,枚举器将用0开始表示第一个符号常量,用1表示第二个,接下来以此类推。所以下面第3行语句将在终端上显示2。
注意,枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。
下面的例子显示了在C++中使用枚举类型的一些不同方法:在全局范围内、在类定义内部、在函数内部等。在X类的定义中,我们首先定义了两个枚举类型:第A行声明了一个A类的weight枚举类型,第B行则声明了一个A类的无名枚举,它只包含两个符号常量d1和d2,表示两个特定的整型值。接下来在第C行是一个构造函数。第A行和第B行声明的枚举的作用域到类定义结束为止。然后,我们在这个类中声明了两个数据:int类型的x和weight类型的wx。在这个类的定义结束之后,第D行和第E行是另外两个全局性质的枚举。
#inlcude <iostream>
using namespace std; class A
{
public:
enum weight { light, medium, heavy, very_heavy };
enum {d1 = 3, d2 = 5 };A(int i, int j) { x = i + d1; wx = (weight)(j +medium); }
void print() const {cout<<x<<" "<<wx<<endl; }
private:
int x;
weight wx;
}; enum { c1 = 17, c2 = 19 };
enum height { tall, very_tall };int main()
{
A obj1(100, 200);
obj1.print();
// A obj2(100, A::light); int y = c1;
cout << y << endl;
height h;
h = tall;
cout << h << endl;
return 0;
}
在main函数中,我们在第F行用两个参数100和200调用了X的构造函数。这个被创建的对象的有趣之处在于它的数据成员wx的值是201,如第H行的输出所示。但是,这个值并不在第A行所声明的weight类型所允许的符号常量值的范围之内。一般而言,枚举类型可以得到一个在枚举声明中并没有列出或枚举器提示范围之外的值。