C++枚举类型
C++ 允许程序员创建自己的数据类型,比如本节要讲的枚举类型。枚举数据类型是一种由程序员定义的数据类型
在C++中,如果一个变量只有几种可能的值,可以定义为枚举类型。枚举是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。
C++声明枚举类型的一般形式为
enum 枚举类型名 {枚举常量表列};
例:
enum weekday
{
Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
};
上面声明了一个枚举类型weekday,花括号中Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday称为枚举元素或枚举常量,表示这个类型的变量的值只能是以上7个值之一,它们是用户自己定义的标识符。
C++在声明了枚举类型之后,可以用声明的枚举来定义变量。
weekday workday,week_end;
//workday和week_end被定义为枚举类型weekday的变量。
学过C语言的读者应该知道,枚举类型名包括关键字enum,但是在C++中允许不写enum,一般也不写enum,但保留了C语言的用法。
enum Roster {Tom, Sharon, Bill, Teresa, John};
该语句将创建一个名为 Roster 的数据类型。因为单词 enum 是 C++ 关键字,所以它必须小写,值得注意的是,数据类型本身的名字是以大写字母开头的。虽然这并非必须,但是绝大多数程序员都会釆用首字母大写的形式。
和 Roster 数据类型关联的命名整数常量被称为枚举量,Roster 数据类型的变量可能只是关联到这些枚举量的值之一,但它们的值是什么呢?
默认情况下,编译器设置第一个枚举量为 0,下一个为 1,以此类推。在上述示例中,Tom 的值将是 0,Sharon 的值为 1,等等。最后一个枚举量 John 的值为 4。
重要的是要意识到,enum 语句示例实际上并没有创建任何变量,只是定义数据类型。当以后创建这个数据类型的变量时,它们看起来就是整数,并且这些整数的值被限制在与枚举集合中的符号名称相关联的整数上。以下语句显示了如何定义 Roster 数据类型的变量:
Roster student;
此语句的形式与其他任何变量定义一样,首先是数据类型名称,然后是变量名称。请注意,数据类型名称是 Roster,而不是 enum Roster。
现在已经创建了 student 变量,它可以被赋予一个值,如下所示:
student = Sharon;
变量的值可以这样测试:
if (student == Sharon)
请注意,在这两个例子中,Sharon 周围没有引号。因为它是一个命名常量,而不是字符串常数。
即使枚举数据类型中的值实际存储为整数,也不能总是将整数值替换为符号名称。例如,不能使用下面的语句将 Sharon 赋值给 student:
student = 1; //错误
但是,可以使用整数值而不是符号名称来测试枚举变量。例如,以下两个 if 语句是等效的:
if (student == Bill)
if (student == 2)
还可以使用关系运算符来比较两个枚举变量。例如,以下 if 语句确定存储在 student1 中的值是否小于存储在 student2 中的值:
if (student1 <student2)
如果 student1 等于 Bill,student2 等于 John,则该语句为 true。但是,如果 student1 等于 Bill,而 student2 等于 Sharon,则该语句将为 false。
如前所述,默认情况下,枚举列表中的符号将被赋给整数值 0、1、2 等等。如果这不合适,则可以指定要赋给的值,如以下示例所示:
enum Department { factory = 1, sales = 2, warehouse = 4 };
请记住,如果为枚举符号赋值,则它们必须是整数。以下赋值语句将产生错误:
enum Department { factory = 1.1, sales = 2.2, warehouse = 4,4 }; //错误
虽然没有要求按升序排列赋给的整数值,但一般默认是这样。
如果在赋值时省略了一个或多个符号,则它们将被赋给一个默认值,来看以下 2 个示例:
【示例 1】
enum Colors { red, orange, yellow = 9, green, blue };
在该示例中,命名常量 red 将被赋值为 0,orange 将为 1,yellow 将为 9,green 将为 10,blue 将为 11。
【示例 2】
enum Rooms { livingroom = 1, den, bedroom, kitchen };
在该示例中,livingroom 被赋值为 1,den 将为 2,bedroom 将为 3,kitchen 将为 4。
枚举数据类型的目的之一是符号名称有助于使程序自我解释。但是,由于这些名称不 是字符串,它们仅在程序中使用。在使用 Roster 数据类型的示例中,以下两个语句将输出 一个 2,而不是名称 Sharon:
Roster student1 = Sharon;
cout << student1;
因为枚举数据类型的符号名称与整数值相关联,所以它们可以在 switch 语句中使用,如下面的程序所示,该程序还演示了可以使用枚举的数据类型,而不实际创建该类型的任何变量。
#include <iostream>
using namespace std;
// Declare the enumerated type
enum Roster { Tom = 1, Sharon, Bill, Teresa, John };
// Sharon - John will be assigned default values 2-5.
int main()
{
int who;
cin >> who;
switch (who)
{
case Tom :
cout << "Tom's birthday is January 3.\n";
break;
case Sharon :
cout << "Sharon's birthday is April 22.\n";
break;
case Bill :
cout << "Bill's birthday is December 19.\n";
break;
case Teresa :
cout << "Teresa's birthday is February 2.\n";
break;
case John :
cout << "John's birthday is June 17.\n";
break;
default :
cout << "Invalid selection\n";
}
return 0;
}
程序运行结果:
2
Sharon’s birthday is April 22.