C++—20、C++ 中枚举ENUMS

今天我们要讲的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枚举。

其实就是给变量限定了取值范围。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Growthofnotes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值