枚举
如果一个变量需要几种可能存在的值,那么就可以被定义为枚举类型。枚举在C/C++中,是一个被命名的整型常数的集合。
枚举类型的定义
- 枚举类型定义的两种方式
- 下述为第一种方式,即在声明的时候同时定义
enum 枚举名 {标识符[=整型常数],标识符[=整型常数],...}
eg:
enum open_modes{input=1,output,append};
在open_modes枚举中,input、output、append称为枚举子,它们限定了open_modes所定义对象的取值范围。
下面定义一个open_file函数
bool open_file(string file_name,open_modes om);
例如:
open_file("abc.txt",1);//error,传递的为非枚举值
open_file("abc.txt",input);//ok,第二个参数应该是input、output、append中的一个
- 第二种方式,即先声明,后定义
enum box b;//先声明enum box类型的变量b
enum {pencil,pen}box,box2//定义enum box类型
枚举作为整数
对于枚举变量中的枚举元素,系统是按照常量来处理的,故叫枚举常量,它们是不能进行普通的算术赋值的。
pencil=1;//error
//但是可以在声明的时候赋值
enum box{pencil=1,pen=2};
- 需要注意的是,如果不进行元素赋值操作,那么元素将会被系统自动从0开始递增赋值操作。如果只给第一个元素进行了赋值,那么第二个元素的值就是第一个元素的值再加1
enum box{pencil=3,pen};//此时pen=4
- 初始化可以赋负数,以后的元素仍然是依次加1
enum box{pencil=-3,pen};//此时pen=4
再如:
enum day{S=7,M=0,T,W,T,F,S};//7,0,1,2,3,4,5,6
- 同一枚举中枚举子的取值不需要唯一,这主要用于分类
enum some_big_cities{
Guangzhou=1,
Shenzhen=1,
Hongkong=1,
Shanghai=2,
Beijing=3,
Tianjing=3
};
- 一个枚举类型的sizeof就是某个能够容纳其范围的整型的sizeof,而且不会大于sizeof(int),除非某个枚举子的值不能用int或者unsigned int来表示。在32位机器中,sizeof(int)=4
枚举的作用域
C++枚举类型继承于C语言,C++枚举也有缺点,最显著的缺点在于作用域,在枚举类型中定义的常量,属于定义枚举的作用域,而不属于这个枚举类型
int main(){
enum box1{pencil,pen};//定义enum box1类型
box1 b;//声明一个enum box1类型的变量b
b=pencil;//ok
b=box::pencil;//错误,vc6.0中提示,pencil不是一个box1
//的成员,vc2010是一个警告错误,限定名中使用了枚举,"main::box1"
enum box2{pencil,pen};//error,重定义,以前的定义时“枚举数”
//由此可知,pencil和pen的作用域和box1的作用域是相同的
return 0;
}