1.实验目的
(1)理解枚举类型的优缺点并学会使用枚举类型。
(2)掌握枚举类型的使用条件和各种限制。
2.实验内容
通过一些简单的函数实验来展现枚举类型的使用方式和使用场景。
3.实验过程
基本概念
1. 枚举的定义如下:
1 enum 枚举类型名 {变量值列表};
知识兔2. 格式说明:
·关键字enum——指明其后的标识符是一个枚举类型的名字。
·变量值列表——由枚举量构成,各枚举量之间以“ ,”间隔,且必须各不相同。
·举例:
1 例如,我们可以定义一种新的变量类型叫做color来储存不同的颜色:
2
3 enum color{black,blue,green,yellow,red,white,purple};
知识兔3. 上述color这句话,有两个作用:
(1) 声明color为新的数据类型,成为枚举(enumeration);
(2) 声明black、blue等为符号常量,通常称为枚举量。
·注意:
(1) 编译系统为每个枚举量(假设有n个)指定一个整型数值,系统默认从0开始,依次为:0,1,2…,n。
1 enum color{ black, blue, green, yellow, red, white, purple };
2 //black=0,blue=1,green=2,yellow=3,red=4,white=5,purple=6
知识兔(2) 可以在定义枚举类型时为部分或全部枚举常量指定整数值,在指定值之前的枚举常量仍按默认方式取值,而指定值之后的枚举常量按依次加1的原则取值。各枚举常量的值可以重复。
enum color{ black, blue=7, green, yellow, red, white, purple };
//black=0,blue=7,green=8,yellow=9,red=10,white=11,purple=12
enum color{ black=7, blue=1, green, yellow, red, white, purple };
//black=7,blue=1,green=2,yellow=3,red=4,white=5,purple=6
知识兔(3) 枚举量只能以标识符形式表示,而不能是整型、字符型等文字常量。
例如,下面语句是非法的:
1 enum letter { 'a', 'd', 'F', 's', 'T' }; //枚举常量不能是字符常量
2
3 enum year{ 2000, 2001, 2002, 2003, 2004, 2005 }; //枚举常量不能是整型常量
4
5 //改为以下定义则合法:
6
7 enum letter{ a, d, F, s, T };
8
9 enum year{ y2000, y2001, y2002, y2003, y2004, y2005 };
知识兔4. 枚举变量的使用:
·在上述color这个定义里我们没有使用任何基本数据类型,也就是说我们创造了一个新的数据类型,而它没有基于任何已经存在的数据类型。
(1)定义格式:定义枚举类型过后,就可以定义该枚举类型的变量,如:
1 color mycolor=blue;
2 enum color mycolor = blue;
3 //这两种写法都可以,C++中声明完枚举类型后,声明变量时,可以不写关键字enum
4 //其中的color相当于我们以前使用的int、float...也就是说,mycolor这个变量为color型
知识兔也可以类型和变量同时定义(甚至类型名可省),格式如下:
1 enum { black, blue, green, yellow, red, white, purple }mycolor;
知识兔(2)枚举量可以进行关系运算,参与运算时用其本身的整数值。例如,设有定义:
1 enum color_set1 { RED, BLUE, WHITE, BLACK } color1, color2;
2 enum color_set2 { GREEN, RED, YELLOW, WHITE } color3, color4;
知识兔允许的赋值操作如下:
1 color3 = RED; //将枚举常量值赋给枚举量
2 color4 = color3; //相同类型的枚举量赋值,color4的值为RED
3 int i = color3; //将枚举量赋给整型变量,i的值为0
4 int j = GREEN; //将枚举常量赋给整型变量,j的值为0
知识兔不允许的赋值操作如下:
1 BLACK = 0; //BLACK是枚举量,此语句非法。
知识兔允许的关系运算符有:==、<、>、<=、>=、!= 等,例如:
1 //比较同类型枚举变量color3,color4是否相等
2 if (color3 == color4) cout << "相等";
3 //输出的是变量color3与WHITE的比较结果,结果为1
4 cout << color3<WHITE;
5 //不同类型的枚举变量之间不能相互赋值。如: color1=color3; //非法
知识兔枚举量的值可以直接输出,输出的是枚举量的整数值:
1 cout << color3; //输出的是color3的整数值,即RED的整数值0
知识兔具体实例
例如一场比赛的结果有四种情况,胜(WIN),负(LOSE),平局(TIE),取消(CANCEL),编写程序输出这四种情况。
1 #include<iostream>
2 using namespace std;
3
4 enum GameResult {WIN,LOSE,TIN,CANCEL};
5
6 int main()
7 {
8 GameResult result;
9 enum GameResult omit = CANCEL;
10
11 for (int count = WIN; count <= CANCEL; count++) { //隐式类型转换
12 result = GameResult(count); //显式类型转换
13 if (result == omit)
14 cout << "The game was cancelled" << endl;
15 else {
16 cout << "The game was played";
17 if (result == WIN)
18 cout << "and we won!";
19 if (result == LOSE)
20 cout << "and we lost!";
21 cout << endl;
22 }
23 }
24 return 0;
25 }
知识兔1. 枚举型数据可以和整型数据相互转换
(1) 如上述代码中的:
int count=WIN
就是把枚举类型的数据WIN隐式转换为整型,作为整形变量count的初值。在循环控制条件
Count<=CANCEL
中,也会把枚举类型数据CANCEL隐式转换为count,再与count进行比较。
(2) 而整型数据到枚举数据的转换,则使用显式转换方式,如上述代码中的:
result=GameResult(count);
此外,也可以利用前面介绍过的static_cast完成转换:
result=static_cast<GameResult>(count);
4.实验心得体会
通过这次实验,很清晰的了解了枚举类型的基本语法和使用场景,对枚举类型的使用有更深层次的理解,最重要的是知道了什么时候需要使用枚举来表达程序意义更加符合,同时使用枚举也提高了代码的可读性。