【C++学习笔记 6】C++中的枚举

枚举(enums)

enum是enumeration的缩写,基本上就是一些值的集合,或者说是在给一些值的集合一个名称。这便于让我们设置一组数值,在给这些值命名之后,代码会变得更加易读。
定义枚举的主要目的是增加程序的可读性,枚举值的本质就是一个整数。

具体一点

#include <iostream>

int A = 0;
int B = 1;
int C = 2;


int main() 
{
	int value = B;

	if (value == B)
	{
		//do something here
	}

	std::cin.get();
}

在这样的场景下,ABC三个变量是零散的,假如我在后文某处,需要重新声明A=2,那么代码就会出现问题。又假如我赋值value=5,并不按照一开始的规则去赋值,那后文的条件语句也失去了意义。
因此,我希望能够定义一种数据类型,使它的值只能是这三者之一,并且可以将这三个值组合起来,这就是枚举的使用场景了。
使用枚举声明下列的值,默认状态下,ABC依次为0、1、2,从0开始递增,本质上就是一堆整数。还可以指定递增的起点,或者是指定每个变量的值。 除此之外,enum还允许我们自行设置数据类型,enum的默认类型是32位的整数,假如我们用不到32位,可以设置为unsigned char,那么枚举值的类型就变为了8位的整数。同时,由于这里对整形的限制,设置float等类型是非法的。

enum Example
{
	A, B, C
};

总的来说,这就是给特定值命名的一种方式,这样就不用到处处理整形数据了。

举个例子

#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.LogLevelError);
	log.Error("Hello");
	std::cin.get();
}

比如我要写一个用来输出程序运行状况的Log类,提示的级别有且只有3个,使用int时容易出现不按意愿运行的情况,因此可以将代码改为

#include <iostream>

class Log
{
public:
	enum Level
	{
		LevelError, LevelWarning, LevelInfo
	};
private:
	Level m_LogLevel = Info;
public:
	void SetLevel(Level level)
	{
		m_LogLevel = level;
	}
	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::LevelError);
	log.Error("Hello");
	std::cin.get();
}

Level的值限制住,并且提高了代码的可读性。其中需要注意的是,在主函数中使用log.SetLevel(Log::LevelError);的方式进行调用,这是因为LevelError枚举值是在Log的命名空间中的,普通的枚举类型Level本身并不是一个命名空间。


教程来源:The Cherno C++ 教程

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值