13 枚举
1 为什么需要枚举
编程的目的,是使用程序解决现实中的问题。在现实中,我们常常可以遇到一个变量只能取已知的几个值的情况。比如:说到今天星期几,我们只能从已知的七个选择中选。
那么,我们应该用什么数据类型来存储 “星期” 这个变量呢?
使用字符串吗?C++ 风格字符串本就比 C 风格字符串更占用内存空间,即使是 C 风格字符串,按每个中文两字节算,也需要至少 8 字节,而且如果我们需要更多字符串,占用的空间将成倍增长。
使用字符串数组记录所有选项,然后用下标来记录具体星期几吗?这样如果我们用的星期变量多的话,占用的空间会比用字符串更少,但是如果只用一两个星期变量,那么,这种方式占用的空间会比直接用字符串大,因为一下子就会占用 7 个三字符字符串的空间。而且,代码的可读性会变差,比如:对于下标 0 ,究竟是星期日还是星期一呢?只能去看数组定义了。
使用 int 吗?一个 int 类型变量只占 4 字节,很省空间。但是可读性问题会更严重,因为只能依靠注释来知道 0 究竟是星期几了。如果编程时,没写注释的话……
为了在减少内存空间使用的同时,可以保持程序可读性,枚举诞生了。
2 枚举的声明
语法 : enum 枚举变量名 {枚举常量列表};
枚举常量列表就是枚举类型变量取值的所有可能选项。
例子 :
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
3 枚举的定义
- 先声明,再定义。
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
week day1, day2;
- 声明的同时定义(与结构体相同,此时也可以不给枚举类型命名)。
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat} day1, day2;
// 或者省略类型名
enum {Sun, Mon, Tue, Wed, Thu, Fri, Sat} day3, day4;
4 枚举的实质
枚举类型实际上是一个 int 型常量的 “集合” ,我们在枚举类型中写的那些选项,实际上是 int 型常量的 “别名” 。
对于 enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
来说, Sum 代表的是 0 ,Mon 代表 1 ,…… Sat 代表 6 。
所以,我们在减少内存空间使用的同时,可以保持程序可读性。
5 枚举的使用
- 枚举变量的可以用枚举选项赋值。
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
week day = Mon;
- 枚举变量的可以用枚举选项代表的数字赋值(需要强制类型转换)。
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
week day = (week)1;
- 使用 cout 输出枚举变量,会输出其代表的数字。
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
week day = Mon;
cout << day << endl; // 输出:1
- 在声明枚举类型时,可以手动设定枚举项代表的数字。此时没有被赋值的枚举项,将在前一项上加一。
enum week {Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat};
//枚举常量Sun,Mon,Tue,Wed,Thu,Fri,Sat的值分别为7、1、2、3、4、5、6。
- 枚举项代表的值可以相同,但最好不要这样做。
enum week {Sun, Mon=1, Tue, Wed = 1, Thu, Fri, Sat};
//枚举常量Sun,Mon,Tue,Wed,Thu,Fri,Sat的值分别为0、1、2、1、2、3、4。
- 枚举常与
switch
联合使用
#include<iostream>
using namespace std;
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
int main() {
week day1 = Mon;
switch (day1) {
case Sun:
cout << "唉,明天又要上班了。" << endl;
break;
case Mon:
cout << "开始上班。" << endl;
break;
case Tue:
cout << "又是上班的一天。" << endl;
break;
case Wed:
cout << "平平无奇的一天。" << endl;
break;
case Thu:
cout << "后天休息。" << endl;
break;
case Fri:
cout << "明天休息,好耶!" << endl;
break;
case Sat:
cout << "好耶,是休息日!" << endl;
break;
}
return 0;
}