C++ 枚举enum
一、定义介绍
枚举(Enumerations)一词常用于数学和计算机科学理论中。枚举作为动词解释是列出某些有穷序列集的所有成员,简单说就是一个一个列举出来,这是它最普遍的意思。枚举作为名词解释就是那个被枚举的有穷序列集,我们在计算机中常用的是它的名词释义。举个例子,一年四季,四个季节组成的有穷序列集{春,夏,秋,冬}就是一个枚举,四季就是枚举名。
在C++中,枚举用enum表示。enum是一个派生数据类型,它可以声明、定义一个整型常数集合。所不同的是,集合里面的整型常数是用其他名字代替的,但只是代替,其本质还是一个整型常数,这一点可以输出来查看一下。是不是有点类似引用。
enum seasons {spring, summer, autumn, winter};
cout << spring << endl;
cout << summer << endl;
cout << autumn << endl;
cout << winter << endl;
//seasons:枚举名
//spring, summer, autumn, winter:枚举常量
输出
0//如果不给枚举常量赋值,那么默认的第一个枚举常量为0,后面的依次加1,如图
1
2
3
需要注意一点,C++中的enum分为scoped enum和unscoped enum两种。最早的时候(C++98)没有scoped enum,enum就等于unscoped enum,所以如果你用的C++98标准就不需要看下面的内容了(不会真有人用吧)。此时使用unscoped enum就会有一个问题,以下面代码为例,枚举常量spring的作用域和seasons所在的作用域是一样的,因此,假设你想在下面再声明一个以spring命名的其他类型的变量时,就会报错重定义的错误。
enum seasons {spring, summer, autumn, winter};
float spring = 1.0; //此处会报重定义的错误
而在C++11中,为了避免这样的问题,就加入了scoped enum,将枚举常量的作用域限定到了这个枚举内,这样在枚举的作用域外面声明与枚举常量相同名称的变量时就不会出错了。当然,为了区别scoped enum和unscoped enum,声明scoped enum时会在enum后面加上一个class。以下面代码为例
enum class seasons {spring, summer, autumn, winter};
float spring = 1.0; //此时就不会报错
这时候你应该明白scope是什么意思了。scope翻译过来是范围的意思,所以scoped的enum就表明作用域范围被限定住了,而unscoped的enum就说明没有限制作用范围。
二、功能作用
所有的事物,都需要人赋予它名称才会有意义,如果人们不称春夏秋冬为春夏秋冬,而是以0123取而代之,我想这样会给人与人的交流带来莫大的不便。在C++中也一样,可能少数的0123你还能够分辨,但如果是动辄万行的代码,用枚举给这些0123赋予名称和意义会更加清晰明了,使程序员能够看明白。
三、使用方法
代码示例
枚举比较常用的就是和switch语句在一起使用,因为switch语句能够接收的数据类型就只有整型和枚举类型。
源码
#include <iostream>
using namespace std;
enum seasons{ spring, summer, autumn, winter};
int main()
{
seasons now;
now = summer;
switch (now)
{
case spring:
cout << "now is spring" << endl;
break;
case summer:
cout << "now is summer" << endl;
break;
case autumn:
cout << "now is autumn" << endl;
break;
case winter:
cout << "now is winter" << endl;
break;
default:
break;
}
return 0;
}
输出
now is summer
来自:九七的C++教程(转载请注明出处)