C++基础之枚举
前言
我们经常需要为某些属性定义一组可选择的值。例如,文件打开的状态可能会有三种:输入、输出和追加。记录这些状态值的一种方法是使每种状态都与一个唯一的常数值相关联。我们可能会这样编写代码:
const int input = 0;
const int output = 1;
const int append = 2;
虽然这种方法也能奏效,但是它有个明显的缺点:没有指出这些值是相关联的。枚举提供了一种替代的方法,不但定义了整数常量集,而且还把它们聚集成组。
定义和初始化枚举
枚举的定义包括关键字 enum,其后是一个可选的枚举类型名,和一个用花括号括起来、用逗号分开的枚举成员列表。
enum open_modes {input, output, append}; //input = 0, output = 1,append = 2
默认地,第一个枚举成员赋值为0,后面的每个枚举成员赋的值比前面的大1。
枚举成员是常量
可以为一个或多个枚举成员提供初始值,用来初始化枚举成员的值必须是一个常量表达式。常量表达式是编译器在编译时就能够计算出结果的整型表达式。整型字面值常量是常量表达式,正如一个通过常量表达式自我初始化的 const 对象也是常量表达式一样。
例如,可以定义下列枚举类型:
//shape = 1, sphere = 2, cylinder = 3, polygon = 4
enum Forms {shape = 1, sphere, cylinder, polygon};
在枚举类型 Forms 中,显式将 shape 赋值为 1。其他枚举成员隐式初始化:sphere 初始化为 2,cylinder 初始化为 3,polygon 初始化为 4。
Tips:
枚举成员值可以是不唯一的。
enum Points {
point2d = 2,
point2w,
point3d = 3,
point3w }; //point2d = 2, point2w = 3, point3d = 3, point3w = 4
本例中,枚举成员 point2d 显式初始化为2。下一个枚举成员 point2w 默认初始化,即它的值比前一枚举成员的值大 1。因此 point2w初始化为 3。枚举成员 point3d 显式初始化为3。一样,point3w 默认初始化,结果为4。
不能改变枚举成员的值。枚举成员本身就是一个常量表达式,所以也可用于需要常量表达式的任何地方。
每个 enum 都定义一种唯一的类型
每个 enum 都定义了一种新的类型。和其他类型一样,可以定义和初始化 Points 类型的对象,也可以以不同的方式使用这些对象。枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行:
Points pt3d = point3d; //正确
Points pt2w = 3; //错误,不能将int型赋给pt2w
pt2w = polygon; //错误, polygon不是一个Points枚举
pt2w = pt3d; //正确
注意把3赋给 Points 对象是非法的,即使3与一个 Points 枚举成员相关联。