您的位置:首页 > 编程语言 > C语言/C++

C++ 初学者指南 第七篇(5)

2010-06-20 17:47 239 查看
转载请标明出处:http://blog.csdn.net/zhangxingping

基本技能7.5:枚举

在C++中我们可以定义一组命名的整型常量列表。这样的列表称之为枚举。这些常量可以出现在任何整型数可以出现的地方。枚举的定义是通过使用关键字enum来完成的,其通用的形式如下:

enum 类型名称 { 值列表 }变量列表;

上面的类型名称就是枚举的类型名称了。其中的值列表是用逗号间隔开的代表枚举值的名称。其中的变量列表是可选项,这是因为我们可以使用上面的类型名称来在后续进行变量的声明。

下面的代码段就定义了一个名称为transport的枚举类型,还定义了两个transport类型的变量叫做t1 和t2:

enum transport { car, truck, airplane, train, boat } t1,t2;

一旦我们定义了一个枚举类型,我们就可以使用它的类型名称来声明变量了。例如,下面的语句就声明了一个名称为how的transport枚举类型的变量:

transport how;

上面的语句还可以写成:

enum transport how;

然而这里使用enum是多余的。由于在C语言中上面的第二种形式是必须的,所以我们在一些程序中还是可以看到这样的形式的。

基于上面的声明的变量,下面的语句给变量how赋值为airplane:

how=airplane;

理解枚举的关键点就是枚举中的每一个标识符都代表的是一个整型值。因此,它们可以出现在任何的整型表达式中。在枚举没有进行初始化的情况下,枚举中的第一个标识符的值是0,第二个标识符的值是1,以此类推。因此

cout << car <<' ' << train;

将输出0 3.

尽管枚举常量会被自动地转换为整型数,而整型数是不能自动地转换为枚举常量的。例如,下面的语句是错误的:

how = 1; //Error

上面的语句会导致编译时的错误,这是因为不存在从整型数到transport枚举类型的自动转换。但是可以通过强制转换的方式来完成这种转换,例如:

how = (transport)1; // 这种方式是符合语法的,但是这是一种很不好的编程风格

上面的代码将给变量how复制为truck,这是因为transport枚举中1的是和truck相关的。正如上面代码中的注释的那样,尽管这种写法是正确的,但是在非特殊的环境下,这种写法是很不好的。

我们还可以通过初始化的方式来制定枚举类型中常量的值。这是通过在常量标识符的后面跟上等号和一个整型数来完成的。当我们使用初始化的时候,被初始化之后的常量的值就是前面常量的值加一。例如,下面的语句给airplane初始化为10:

enum tranport { car, truck, airplane = 10, train, boat };

这样一来,枚举transport中标识符的值如下:

car

0
truck
1
airplane
10
train
11
boat
12
一个常见的错误就是企图把枚举中的标识符作为字符串来进行输入或者输出。实际并不是这样的。例如,下面的程序不会像期望的那样:

//下面的代码并不会输出trian

how = train;

cout << how;

请记住标识符train只是一个整型数的名称,它不是一个字符串。因此,上面的代码输出的将是train标识符的值,而不是字符串“train”。实际上,要把枚举中的标识符作为字符串使出或者输入是一个很繁琐的过程。例如,下面的代码就是用于输出标识符字符串的,也就是说输出how中的交通工具的类型:

switch(how)
{
case car:
cout << "Automobile";
break;
case truck:
cout << " Truck";
break;
case airplane:
cout << "Airplane";
break;
case train:
cout << "Train";
break;
case boat:
cout << "Boat";
break;
}
有时,我们可以定义一组字符串的数组,并使用枚举值作为字符串数组的所引来获取枚举值对应的字符串。例如,下面的程序就打印出三种交通工具的类型;
//演示枚举的使用
#include <iostream>
using namespace std;
enum transport
{
car,
truck,
airplane,
train,
boat
};
char name[][20]=
{
"Automobile",
"Truck",
"Airplan",
"Train",
"Boat"
};
int main()
{
transport how;
how = car;
cout << name[how] << "\n";
how = airplane;
cout << name[how] << "\n";
how = train;
cout << name[how] << "\n";
return 0;
}
程序的输出如下:

Automobile

Airplan

Train

上述陈述中的把枚举值转换成字符串的方法可以适用于一切没有使用初始化的枚举类型。为了能正确地对字符串数组进行所以,枚举常量的值必须是冲0开始,并且保持严格的升序排列,后一个都是比前面的一个大1。正是由于枚举值到字符串的转换是需要人工完成的,所以枚举类型通常只用于不需要这种转换的情况。例如,我们常见到的就是使用枚举来定义编译器的符号表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: