C++ 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.