1、枚举基础
用户自定义类型,是若干个有名字常量组成的有限集合。
(1)枚举类型
定义格式:
{
<枚举元素1>[=<整型常量1>],
<枚举元素2>[=<整型常量2>],
<枚举元素3>[=<整型常量3>],
...
<枚举元素n>[=<整型常量n>],
}
其中,enum是定义枚举类型的关键字,不能省略。<枚举类型名>是用户定义的标识符,<枚举元素>也称枚举常量,也是用户定义的标识符。
C++语言允许用<整型变量>为枚举元素指定一个值。如果省略<整型常量>,默认<枚举元素1>的值为0,<枚举元素2>的值为1,...,以此类推,<枚举元素n>的值为n-1.
例如,以下代码块定义了一个枚举类型season:
enum season {spring=1,summer,autumn,winter};
(2)枚举变量
枚举变量可以在定义枚举类型的同时声明,也可以用枚举类型声明。
(3)枚举类型变量的使用
可以将枚举元素视为一个整型变量,进行运算。
enum color {red,yellow,green,blue,black} c1,c2; //声明两个枚举变量c1,c2
enum weekday {monday=1,tuesday,wednesday,thursday,friday,saturday,sunday=0};
enum weekday day1,day2; //声明两个枚举变量day1,day2
c1 = green; //给枚举变量c1赋值
day1 = saturday; //给枚举变量day1赋值
(4)枚举的取值范围
如果某个枚举中所有枚举子的值均为非负,该枚举的表示范围就是[0:2^k-1];
如果存在负的枚举值,该枚举的取值范围就是[-2^k,2^k-1]
例如:
enum e1 {dark,light}; //范围为0:1
enum e3 {min=-10,max=1000}; //范围为-1024:1023
(5)枚举与整型的关系
整型值只能显式地转换成一个枚举值,但是,如果转换地结果位于该枚举值取值范围之外,结果无定义。
enum e1 {dark=1,light=10};
e1 VAR1=e1(50); //无定义
e1 VAR2=e1(3); //编译通过
(6)sizeof
一个枚举类型的sizeof就是某个能够容纳其范围的整型的sizeof,并且不会大于sizeof(int),除非某个枚举子的值不能用int或者unsigned int来表示
在32位机器中,sizeof(int)一般等于4。
注意:
【1】枚举类型可以用于switch...case语句;
【2】枚举类型不支持直接的cin>>和cout<<;
【3】枚举元素之间比较可以用这六个操作符:<,>,<=,>=,!=,==;
【4】枚举类型可以作为函数的返回值;
【5】枚举是用户自定义的类型,所以用户可以为它定义自身的操作,例如++或者<<等,但是在没有定义之前,不能因为枚举像整型就可以默认使用;
【6】由于通过将整型数显式转换就可能得到对应枚举类型的值,所以声明一个枚举来达到限制传递给函数的参数取值范围还是力不从心的。
2、使用枚举
[演示枚举的具体使用流程]
#include <iostream>
#include<string>
using namespace std;
int main()
{
enum week {monday,tuesday,wednesday,thursday,friday,saturday,sunday} w;
int i;
do {
cout << "please input(0~7,0 for exit):" << endl;
cin >> i;
switch (i)
{
case 1:w = monday;
cout<<"enum id:"<<w<<" week="<< "monday" <<endl;
break;
case 2:w = tuesday;
cout << "enum id:" << w << " week=" << "tuesday" << endl;
break;
case 3:w = wednesday;
cout << "enum id:" << w << " week=" << "wednesday" << endl;
break;
case 4:w = thursday;
cout << "enum id:" << w << " week=" << "thursday" << endl;
break;
case 5:w = friday;
cout << "enum id:" << w << " week=" << "friday" << endl;
break;
case 6:w = saturday;
cout << "enum id:" << w << " week=" << "saturday" << endl;
break;
case 7:w = sunday;
cout << "enum id:" << w << " week=" << "sunday" << endl;
break;
case 0:cout << "Exit!" << endl;
break;
default:
cout << "wrong! " << endl;
}
} while (i != 0);
return 0;
}
[演示带有初始值枚举的具体使用流程]
#include <iostream>
#include<string>
using namespace std;
int main()
{
enum week {monday=6,tuesday,wednesday,thursday,friday=0,saturday,sunday} w1; //完整形式
enum { red, black, blue, green } w2; //匿名枚举
enum day {yesterday,today,tomorrow}; //只定义枚举类型
enum week w3 = monday; //用完整形式声明变量
enum day w4; //先定义枚举类型,再声明变量
week w5; //不带enum关键字声明变量
w5 = (enum week)6; //强制类型转换
cout << "monday--" << monday << endl;
cout << "tuesday--" << tuesday << endl;
cout << "wednesday--" << wednesday << endl;
cout << "thursday--" << thursday << endl;
cout << "friday--" << friday << endl;
cout << "saturday--" << saturday << endl;
cout << "sunday--" << sunday << endl;
return 0;
}
结果如下:
以上展示了多种定义枚举的方法。