今天我们要讲的C++中的枚举(enums)是enumeration的缩写,基本上就是一些值的集合。如
一、为什么要使用枚举
如果您想要给枚举一个更实用的定义,那就是给一个值指定一个名称。
我们不要设置一维叫a,b,c的整数值,而是可以设置一个包含与整数a,b,c相对应的枚举。
这很方便我们设置一组数值,而不仅仅只是用整形作为一个类型。当然你也可以给它赋值任何整数,并且限制哪些值可以赋值。
这就是一种给值命名的方式,这在你想用一些整数来表示特定的状态或者数值时很有用。
给这些值命名后,你的代码会变得更易读(定义枚举类型的主要目的:增加程序的可读性。)
枚举值就是一个整数,在代码里,可能看起来有点不一样,它还能让你的代码保持更整洁。
假设我有三个值
int a=0;
int b=1;
int c=2;
现在我有了三个要处理的值,然后再main函数里来使用一个变量value,让value设置为上面三个值中的其中一个。
int value=b;
我可能有些代码来检查当前的value,然后执行某些操作。
if(value==b)
{
//do some thing here
}
这看起来还行,但存在一些问题,首先就是,a,b,c没有分组,在后面的代码中你可能还有变量d,或者你想重新生命a,这就出现问题了。最本质的问题就是这些数据没有分组。而且这些值都是整数,这意味着如果我突然把value赋值为5,那下面的代码就没有任何意义了。
我们希望可以定义一种数据类型,是他的值只能是这三个中的某一个值,而且可以把这些数据组合起来;这就是枚举的使用场景了。
enum Example
{
a,b,c
};
这里不用int作为类型,可以用这个枚举的名称作为一个实际类型。
所以我可以写一个Example类型的值,这样我就可以用我的枚举值了,我可以这样给value赋值。
Example value=b;
如果我给它赋值其他的值就会报错,因为它必须是这三个值中的一个。
最后记住了,这些数据就是一些整数。
如果我把它赋值为b,然后进行比较是否等于1,因为b的值就是1,如果你把鼠标停在上面,编辑器会告诉你b的值就是1.
if(value==1)
{
}
运行结果如下:

你也可以改变这些变量的值。默认情况下,第一个变量的值为0,然后接下来变量会一个接一个的递增(1,2,3...)你也可以设置为任何数,例如:
enum Example
{
a=6,b=5,c=3
};
还有一个就是你还可以指定你的枚举值的数据类型,比如说无符号字符型,枚举值的默认类型是32位的整数,不可以用float,这里只能用整形。
enum Example:unsigned char
{
a=6,b,c
};
它就是给特定值命名的一种方式,这样你就不用到处处理各种整型数据了。
二、枚举类型的定义
枚举类型(enumeration)是 C++ 中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
定义格式:枚举类型的定义格式为:
enum <类型名> {<枚举常量表>};
格式说明:
- 关键字enum——指明其后的标识符是一个枚举类型的名字。
- 枚举常量表——由枚举常量构成。"枚举常量"或称"枚举成员",是以标识符形式表示的整型量,表示枚举类型的取值。枚举常量表列出枚举类型的所有取值,各枚举常量之间以","间隔,且必须各不相同。取值类型与条件表达式相同。
- 例如:
enum color_set1 {RED, BLUE, WHITE, BLACK}; // 定义枚举类型color_set1 enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; // 定义枚举类型week
三、枚举应用举例
让我们来看一个在Log类中真实使用枚举的例子,先回顾下Log类:
#include<iostream>
class Log
{
public:
const int LogLevelError = 0;
const int LogLevelWarning = 1;
const int LogLevelInfo = 2;
private:
int m_LogLevel = LogLevelInfo;
public:
void SetLevel(int level)
{
m_LogLevel = level;
}
void Error(const char* message)
{
if (m_LogLevel >= LogLevelError)
std::cout << "[ERROR]:" << message << std::endl;
}
void Warn(const char* message)
{
if (m_LogLevel >= LogLevelWarning)
std::cout << "[WARNING]:" << message << std::endl;
}
void Info(const char* message)
{
if (m_LogLevel >= LogLevelInfo)
std::cout << "[INFO]:" << message << std::endl;
}
};
int main()
{
Log log;
log.SetLevel(log.LogLevelWarning);
log.Warn("warning");
log.Error("Error");
log.Info("Info");
std::cin.get();
}
运行结果:

在这个Log类中我们定义了三个不同的级别:
const int LogLevelError = 0;
const int LogLevelWarning = 1;
const int LogLevelInfo = 2;
它们的值分别是0到2,这里是非常适合使用枚举的地方,在这里我们有三个整形的值用来表示不同的特定状态,在这个例子中不同的Log级别会展示出不同的日志内容。在这个long类内部,我们可以建一个Log级别的枚举值,如下:
enum level
{
Error, Warning, Info
};
然后我只想把m_LogLevel设置为Error, Warning, Info值中的一个,所以我把这个变量的数据类型设置为level枚举类型,注意这里就产生了限制,它的值只能是 Error, Warning, Info这三个的一个。
编译器从语法上就执行了这个限制。
修改后的代码如下:
#include<iostream>
class Log
{
public:
enum level
{
levelError, levelWarning, levelInfo
};
private:
level m_LogLevel = levelInfo;
public:
void SetLevel(level levell)
{
m_LogLevel = levell;
}
void Error(const char* message)
{
if (m_LogLevel >= levelError)
std::cout << "[ERROR]:" << message << std::endl;
}
void Warn(const char* message)
{
if (m_LogLevel >= levelWarning)
std::cout << "[WARNING]:" << message << std::endl;
}
void Info(const char* message)
{
if (m_LogLevel >= levelInfo)
std::cout << "[INFO]:" << message << std::endl;
}
};
int main()
{
Log log;
log.SetLevel(Log::levelWarning);
log.Warn("warning");
log.Error("Error");
log.Info("Info");
std::cin.get();
}
注意其中的log.SetLevel(Log::levelWarning);可以换成log.SetLevel(log.levelWarning);
四、枚举需要注意的地方
枚举常量代表该枚举类型的变量可能取的值,编译系统为每个枚举常量指定一个整数值,默认状态下,这个整数就是所列举元素的序号,序号从0开始。 可以在定义枚举类型时为部分或全部枚举常量指定整数值,在指定值之前的枚举常量仍按默认方式取值,而指定值之后的枚举常量按依次加1的原则取值。 各枚举常量的值可以重复。例如:
enum fruit_set {apple, orange, banana=1, peach, grape}
//枚举常量apple=0,orange=1, banana=1,peach=2,grape=3。
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 letter_set {'a','d','F','s','T'}; //枚举常量不能是字符常量
enum year_set{2000,2001,2002,2003,2004,2005}; //枚举常量不能是整型常量
可改为以下形式则定义合法:
enum letter_set {a, d, F, s, T};
enum year_set{y2000, y2001, y2002, y2003, y2004, y2005};
- 枚举变量可以直接输出,但不能直接输入。如:cout >> color3; //非法
- 不能直接将常量赋给枚举变量。如: color1=1; //非法
- 不同类型的枚举变量之间不能相互赋值。如: color1=color3; //非法
- 枚举变量的输入输出一般都采用switch语句将其转换为字符或字符串;枚举类型数据的其他处理也往往应用switch语句,以保证程序的合法性和可读性。
今天要讲的就是给“值”起个提高代码可读性的名字(并分到组里),这个“组”就是Enum枚举。
其实就是给变量限定了取值范围。

1万+

被折叠的 条评论
为什么被折叠?



