在实际的编程应用中,有的变量只有几种可能的取值,譬如说一个家族的几个成员,性别的两种可能等等。C++为这种类型的变量的定义提供了enum关键字。要使用枚举类型的变量,首先需要先定义一个枚举类型名,再声明变量是该枚举类型的。
一、枚举类型的定义
1、定义方式:
enum 枚举类型名字
{枚举常量表
}
关键字enum:说明接下来定义的是一个枚举类型
枚举类型名字:指明此处定义的枚举类型的名字,就像整型的名字叫int,字符型的名字叫char。
枚举常量表:由枚举常量(或称枚举成员)构成。枚举常量表列出枚举类型所有可能的取值,各枚举常量之间用“,”间隔,且各枚举常量必须不同。
例如:
//定义枚举类型colors
enum colors{blue,black,red,green};//定义枚举类型week
enum week
{Sun, Mon, Tue, Wed, Thu, Fri, Sat};
特别注意:枚举常量只能以标识符形式表示,而不能是整型、字符型等文字常量。例如,以下定义非法:
enum letter_set {'a','d','F','s','T'}; //枚举常量不能是字符常量
enum year_set{2000,2001,2002,2003,2004,2005}; //枚举常量不能是整型常量
可改为以下形式则定义合法:
enum letter_set {a, d, F, s, T};
enum year_set{y2000, y2001, y2002, y2003, y2004, y2005};
2、枚举元素的说明
(1)在枚举类型定义的时候,枚举常量表中的常量代表了该枚举类型的变量所有可能取值。编译系统会为每个枚举常量指定一个整型值。为了方便后面的叙述,暂时称作枚举值,即每一个枚举常量,都有一个枚举值与之对应。缺省状态下,这个枚举值就是所列举元素的序号,序号从0开始。
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
//枚举常量Sun,Mon,Tue,Wed,Thu,Fri,Sat的值分别为0、1、2、3、4、5、6。
测试:
(2)在定义枚举类型时候,也可以自己对枚举元素赋值。此时,已经被赋值枚举常量的枚举值即为所赋的值。如果存在没有被赋值的枚举常量,则按照指定值之后的枚举常量按依次加1的原则取值。
enum week {Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat};
//枚举常量Sun,Mon,Tue,Wed,Thu,Fri,Sat的值分别为7、1、2、3、4、5、6。
仿照上面例程,自行写测试程序。
二、枚举类型的变量的使用
1、变量声明
完成枚举类型的定义之后,就可以使用该类型去声明该类型的变量。用枚举类型声明的变量称为枚举变量。
枚举变量有以下几种声明方式:
(1)枚举类型定义与变量声明分开
enum colors{blue,black,red,green};
//声明colors枚举类型的变量
enum colors Picture;
enum colors Gif;
enum colors Graph;
变量Picture,Gif,Graph都是枚举类型colors下声明的变量。
(2)枚举类型定义与变量同时进行
enum colors
{ blue,black,red,green
}Picture,Gif,Graph;
//定义枚举类型并声明colors枚举类型的变量
变量Picture,Gif,Graph都是枚举类型colors下声明的变量。同时,在这种变量声明的方式下,有时候可以将枚举类型的名字省略。
enum
{ blue,black,red,green
}Picture,Gif,Graph;
//定义枚举类型并声明colors枚举类型的变量
(3)用typedef先将枚举类型定义为别名,再利用别名进行变量的声明
此种方法一般不常用,在使用的过程中要注意,同一程序中不能定义同类型名的枚举类型;不同枚举类型的枚举元素不能同名。
2、枚举变量的赋值和操作
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat}a,b,c;//定义枚举类型week并声明变量a,b,c
(1)枚举常量是常量,不是变量。不能在定义之外的任何地方用赋值语句对它赋值。sun=5;mon=2;sun=mon; 都是错误的。
(2)只能把枚举常量赋予枚举类型的变量,不能把枚举常量对应的整数值直接赋予枚举变量。如: a=sum;b=mon; 是正确的。而:a=0;b=1;是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换,如: a=(enum week)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于: a=tue;
(3)枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。
综上,可以总结允许的赋值操作有
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat}a,b,c;//定义枚举类型week并声明变量a,b,c
a=Sun; //将枚举常量赋值给枚举变量
b=a;//相同类型的枚举变量赋值,b的值也为Sun
int i = a;//将枚举变量赋给整型变量,i的值为0
int j = Sun;//将枚举常量赋给整型变量,j的值为0
(4)枚举变量允许的关系运算有:==、<、>、<=、>=、!=等。例如:
//比较同类型枚举变量a,b是否相等if (a==b) cout<<”相等”;
//输出的是变量c与Mon的比较结果,结果为1cout<<c<Mon;
(5)枚举变量值只定义了关系运算符和赋值运算符,没有定义算数运算符。例如:
enum color{red,orange,yellow,green,blue};
enum color choice;
choice = red; //valid
choice = choice+1; //invalid
choice = 2; //invalid
choice = red + yellow; //invalid
枚举量是整型,可以自动被提升为int类型,但int类型不能自动转换为枚举类型。如果将枚举类型转化为int类型,如果int值是有效的,可以通过强制类型转换,把它赋值给枚举类型,完成间接的+操作。
int choice_i = choice; //valid
choice_i = 1+ red //valid
int choice_j = yellow; //valid
choice = (enum color)(choice+yellow) //valid
choice = (enum color)2 //valid
(6)枚举变量可以直接输出,输出的是变量的整数值。例如:
cout<< a;
//输出的是a的整数值,即Sun的整数值0
三、学习参考
1、C++枚举类型详细解析
2、探索C语言中的联合体与枚举:数据多面手的完美组合