我们在写程序的时候,常常要定义一组与对象有关的属性,例如,一个文件可能会以三种状态(输入,输出和追加)之一被打开。典型的情况下,我们通过吧每个属性和一个唯一的const值相关联,来记录这些状态值。因此我们可能会写到:
并按如下方式使用这些常量:
尽管这样也能奏效,但是它却存在许多的缺点,其中一个主要的缺点就是:我们没有办法限制传递给函数的值只能是input,output,append这三个之一。
枚举提供了一种替代的方法,它不但定义了整数常量,而且还把它们组合成一个集合。例如:
open_modes是一个枚举类型,每个被命名的枚举定义了一个唯一的类型,它可以被用作类型标识符,例如:
input,output和append是枚举成员,它们代表了能用来初始化和赋值open_modes类型变量的值的全集。例如:
如果我们试图向上面的函数传递一个input,output和append以外的值,编译器就会产生编译错误,而且如果像下面这样传递一个相等的整数值,编译器仍然会将它标记为错误:
我们不能做到的是打印枚举成员的实际枚举名,当我们这样写的时候:
cout<<input<<" "<<om<<endl;
输出为:
1 3
一种解决的方案是定义一个由枚举成员的值索引的字符串数组,因此,我们可以这样写:
cout<<open_mode_table[input]<<""<<open_mode_table[om]<<endl;
输出为:
input append
第二件不能做的事情是,我们不能使用枚举成员函数进行迭代,如:
//不支持
for(open_modes iter=input;iter!=append;++iter)
//...