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

C++知识:枚举 什么是枚举 枚举算法是一种经典的暴力算法,是通过遍历所有候选答案以找到正确的解的问题解决策略; 枚举的基本框架 1.给出解空间 建立数学模型,确立候选答案的范围,从数学的角度说:就是给出可能解的集合,这是最关键的一步,确立正确的解空间是应用枚举算法的前提。 2.找到枚举的具体方法 在确立了正确的解空间后,还要知道怎么枚举才能找到正确的答案。 对于不同的问题,枚举的具体方法很可能是不同的。 枚举的种类 1.循环枚举 通过数层循环来达到穷举解空间里的解,找到正确的答案,是最基本的枚举算法 例: 求小于 N 阅读详情

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

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

C++枚举解读(enum) 对于开发C++来说,枚举是一个几乎必然用到的功能。当然今天要讲的枚举肯定不是平常漫不经心的使用,而是从里到外地深扒它,逐渐揭开它神秘地面纱,发现一些未曾注意到地东西。枚举值的默认值是有规律的,如果不能满足你的需求,就自定义值建议使用枚举类,副作用比较小。主要是名字空间污染的问题,可能一不小心就会引发其他的问题。 阅读详情

相关推荐

c++中的enum类型

C++允许程序员创建自己的数据类型,比如本节要将的枚举类型。枚举数据类型是一种由程序员定义的数据类型,其合法值是与它们关联的一组命名整数常量。 之所以被称为枚举类型,就是因为命名常量是作为数据类型定义的一部分而枚举或列出的,以下是枚举类型声明的示例: enum Roster {Tom, Sharon, Bill, Teresa, John}; 该语句将创建一个名为 Roster 的数据类型。...

digitalkee的博客 2万+

【C++】C++中的枚举enum类型使用详解

枚举(enumeration)和类相似,能够定义一种新的数据类型,不同的是,枚举是将一组整形常量组织在一起,所以和类的使用方法有一些类似之处。1.不限定作用域的枚举enum colorRED,GREEN,BLUE。

qq_35902025的博客 9万+

Qt和C++中的反射机制实现与运用(2)

enum DockOption { AnimatedDocks = 0x01, AllowNestedDocks = 0x02, AllowTabbedDocks = 0x04, ForceTabbedDocks = 0x08, // implies AllowTabbedDocks, !AllowNestedDocks VerticalTabs = 0x10, // implies AllowTabbed...

Mr.Sugarcane 1580

C++详解:枚举类型 --- enum | Xunlan_blog

文章目录一、概念二、定义枚举元素表三、定义枚举对象的操作四、要点&技巧 一、概念 枚举类型 (enumeration),是C++中的一种派生数据类型,是用户创建的一个集合,可以增加程序的可读性,在一些需要重复用到一些元素时颇有益处。 二、定义 枚举类型的定义格式: enum enum_name {/*enum_table*/}; enum enum_name {/*enum_table*/} enum_val; 其中: enum :枚举类型关键字,声明后面定义的是枚举类型。 enum_nam

Xunlan_博客 1万+

Cadence元件库介绍

Cadence安装完之后,在安装目录下,会有默认自带的一些常用元件库。例如,我的Candece安装目录为: D:\Cadence\Cadence_SPB_17.2-2016 元件库所在目录为: D:\Cadence\Cadence_SPB_17.2-2016\tools\capture\library 各个元件库对应的内容如下: AMPLIFIER.OLB 共 182 个零件,存放模拟放大器 IC,如 CA3280,TL027C,EL4093 等。 ARITHMETIC.OLB 共 182 个零件,存放

年少时的棉花糖 1万+

echarts实现3D地图——map3D

【代码】echarts实现3D地图——map3D。

xiaoququ的博客 7317

Better Enums:C++枚举反射库的深度解析与实战指南

枚举(enum)是C++中用于定义命名常量的基础类型,它通过提供类型安全来替代“魔法数字”,使代码意图更清晰。其原理是将一组相关的整数值与有意义的标识符绑定,从而提升代码的可读性和可维护性。这项技术的核心价值在于消除重复的样板代码,实现枚举的“自描述”能力,例如在日志输出、配置解析和UI交互等应用场景中,经常需要将枚举值与可读字符串相互转换。传统做法需要手动维护映射表或switch语句,不仅繁琐且易出错。Better Enums库通过编译期反射机制,为C++枚举提供了强大的字符串化、遍历和类型安全转换功能,

weixin_33770878的博客 395

从PCEP到PCAP:一个数据分析师的Python认证升级之路与学习规划

本文详细介绍了数据分析师从PCEP(初级)到PCAP(中级)的Python认证升级路径,包括考试内容、备考策略和时间规划。通过系统化的学习,读者可以掌握Python在数据分析中的核心应用,提升职业竞争力。文章还提供了实用的代码示例和认证考试对比,帮助读者高效备考。

weixin_27427619的博客 438

Better Enums社区贡献指南:如何参与这个开源C++枚举反射库的发展

欢迎来到Better Enums社区!🎉 这是一个强大的C++编译时枚举反射库,提供了枚举到字符串转换、迭代等强大功能,全部封装在单个头文件中。无论你是C++开发者、开源爱好者,还是想为高质量C++库做出贡献的程序员,这份完整的贡献指南都将帮助你快速上手。 ## 🔍 了解Better Enums项目 Better Enums是一个创新的C++枚举增强库,它解决了传统C++枚举的诸多限制。通

gitblog_01103的博客 877

Vivado Schematic视图实战:从RTL分析到布局布线,如何用它快速定位设计问题(附2019.1版操作)

本文深入解析Vivado Schematic视图在FPGA设计中的关键作用,从RTL分析到布局布线全流程,帮助工程师快速定位设计问题。通过三重视图对比、高效调试四步法和高级技巧,提升问题排查效率,缩短调试时间。文章结合2019.1版操作指南和实战案例,展示如何利用Schematic视图解决典型设计问题。

weixin_30591551的博客 488

《R语言实战》第八章之回归分析图形

回归分析图形 回归分析分为简单回归与复杂回归 1 : 简单线性回归即:模型中只包含一个因变量和一个自变量,有时候也会包含多项式, 这个图形描述了身高与体重的线性关系,这也是一个多项式图形 2:当我们的预测变量(自变量)不止一个时,就属于多元线性回归,而且多元线性回归中也可以包含多项式以及交互项 (1)在进行多远回归分析之前可以先描述变量之间的相关关系 上图为一个散点图矩阵,描述了五个变量之间的相关关系,我们可以通过非主对角线的散点图来查看两个变量之间的关系。 多元线性回归简单地就是OLS回归,通过lm和

Strawberry_Ya的博客 1833

scoped enums各版本异同

1、C++98枚举(无尾部逗号)2、C++11(支持尾部逗号枚举),允许最后一个成员后跟一个逗号,为了代码维护方便,添加新成员时不需要修改上一回代码3、C++11(支持枚举前向声明),允许只声明枚举类型,而不定义其成员,即前向声明;可解决头文件循环依赖问题,也可在不需要暴露成员时隐藏实现细节//前向声明无作用域枚举的声明方式1、底层类型不固定编译器会选择一个最小的整数类型来容纳所有枚举值默认使用int,如果值超出int会使用long。

qq_36606147的博客 965

DSP篇--C6678功能调试系列之SPI调试

SPI传输数据分为线上直接收发和通过EDMA的数据传输两种。第一种是直接将数据放在线上(SPIDAT1),在寄存器(SPIBUF)中写入命令实现数据的收发;第二种需要配置EDMA,将数据buffer直接作为EDMA的数据源进行传输,其需要配置的参数和中断与EDMA一致。

nanke_yh的博客 1258

Effective Modern C++[实践]->优先使用 scoped enums,而非 unscoped enums

1. `C++98` 风格的枚举,现在称作为` unscoped enum`。 2. `scoped enum` 的枚举元素只在` enum` 内可见, 元素只能强制转换成其他类型。 3. `scoped enum` 和` unscoped enum` 都可以指定潜在类型。 `scoped enum `默认是 `int`,`unscoped enum `没有默认类型。 4. `scoped enum` 总是能前置声明,`unscoped enum` 只有指定了潜在类型, 才可以前置声明。.........

西门吹雪 969

Unity的粒子系统使用shadergraph(内置管线)制作的一个顶点偏移shader,但是粒子模型移动时,顶点也会偏移?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1174

Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动

在上一篇中,我们编译了kernel,并在qemu上进行了运行,但到最后,在挂载根文件系统时候,挂载失败,这是因为我们还没有根文件系统,在本章中,我们将制作根文件系统。rootfs制作方式有很多方式,如busyBoxbuildrootYocto等,在该篇章中,我们使用buildroot来制作根文件系统,主要考虑到busyBox制作完还需要手动首改一些启动配置比较繁琐,而Yocto如果电脑配置不是很好,编译时间过长,比较麻烦。

sinat_33909696的博客 2465

从 C++11 到 C++23:枚举的原理升级与实践

/ 溢出:256超出uint8_t的潜在值域[0,255]// GCC 12:按模截断(256 mod 256 = 0,结果为SafeEnum(0))// Clang 15:直接赋值(结果为SafeEnum(256),但sizeof仅1字节,实际存储0)// MSVC 2022:断言失败(Debug模式)或随机值(Release模式)规避方案// 计算潜在值域边界0 :// 编译期检查(若val为常量表达式)// 运行时检查(若val为变量)// 编译期安全转换// 成立。

hw5230的博客 1042

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

《Effective Cpp》Item 2: 用 consts, enums 和 inlines 取代 #defines

理解 用编译器取代预处理器 const 取代 define define 编译代码时,在预处理阶段进行宏替换,直接进行内容替换,编译器不会将定义的宏添加到符号表。所以如果有编译错误时,不会提示宏错误而是提示宏的具体内容。 举例: #define ASPECT_RATIO 1.653 此处,编译的时候,ASPECT_RATIO 不会添加到符号表,而是在代码的每一处都会有一个 1.653,如果报错,那么也会有多处报错,提示是1.653这块出了问题,而不是ASPECT_RATIO 这里出了问题。同样在debug

CodingStart 314

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Qt QML与C++混合编程

Qt QML与C++混合编程

m0_73443478的博客 2603

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Page Assist 浏览器扩展:把本地 AI 助手装进任意网页,离线也能问

看长篇英文论文、啃技术文档的时候,如果旁边有个懂当前页面的 AI 可以随时提问,体验会好很多。但多数在线工具的做法是把页面内容传给云端服务,隐私上总有点不放心。Page Assist 是一个开源的**本地 AI 助手浏览器扩展**:它连接跑在你自己机器上的模型,在任何网页的侧边栏里就能与页面对话——总结、翻译、提问、分析都可以,而且全程不需要联网同步数据,所有记录都留在浏览器本地。 ## 三分钟

gitblog_00219的博客 642

Compound Types: Enums and Structs___CH_10

CH___10

Sjoqwdk的博客 337

Android是否推荐使用枚举(enum)?使用枚举的利弊以及枚举倒底占多少内存?

一、安卓中是否推荐使用枚举enum产生: enum的全称为 enumeration,是 JDK1.5 中引入的新特性,存放在 java.lang 包中,包括Enum,EnumSet,EnumMap等。 其中Enum就是我们在C或C++中见过的枚举类型,但是Java中的枚举又比C或C++中的枚举更成熟和复杂。Android官方建议:  Android官网不建议使用enums,占用内存多(Enums ...

栀夏暖阳的博客 1228

C++入门笔记

主要介绍了函数/方法,在C++ 中的声明等信息。返回值,以及定义等主要讲解了C++ 头文件的一些注意事项如图增加了一个条件,有没有定义LOG.H 文件,如果定义了则是不进行下面的 声明?1.断点:在debug的时候使得代码停止,需要放在有代码的行上 2. 调试模式和发布模式在断点上会有一些差异 3. 调出界面查看数值,debug后会有一个Autos的界面,其中可以在name上输入值。然后查看 4. 查看memory地址下的值,打开窗口后输入address即可。 汇编的角度查看if循环中执行的代码 主要讲解

伪NChris的博客 1013

QML与C++混合编程详解

QML与C++混合编程详解 1、QML与C++为什么要混合编程 QML与C++为什么要混合编程,简单来说,就是使用QML高效便捷地构建UI,而C++则用来实现业务逻辑和复杂算法,下面介绍了两者间交互的方法与技巧。 2、QML访问C++概述 Qt集成了QML引擎和Qt元对象系统,使得QML很容易从C++中得到扩展,在一定的条件下,QML就可以访问QObject派生类的成员,例如信号、槽函数、枚举类型...

bubbleyang的博客 254

Effective C++改善程序与设计的55个具体做法笔记

让自己习惯C++ Item1:将C++视为federation of languages Item2:用consts、enums和inlines取代#define 限定作用于,会放在常量区,但枚举不占用对象的存储空间,除非是枚举变量。 Item3:尽可能的使用const const成员函数,相当于const this对象,可以操作const对象和不改变对象,两个成员函数如果只是常量性不同可以重载。 const写在类型之前或者类型之后都是可以的,.........

kwdecsdn的博客 786

二进制状态枚举

如果要对n个物体进行选择,那么有多少种情况? #include &lt;bits/stdc++.h&gt; using namespace std; int main(){     //n &lt;= 20 1e6     //1e8     int n = 3;      for(int i = 0; i &lt; (1 &lt;&lt; n); i++)// 相当于枚举所有的情况 o(2^n...

qq_41555192的博客 198
上一篇: C++—19、C++ 中静态存储static
下一篇: C++—21、C++ 中构造函数Constructors
Growthofnotes
博客等级 码龄5年 991粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Growthofnotes

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

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

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

打赏作者

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

抵扣说明:

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

余额充值