当前位置: 首页 > news >正文

C++枚举解读(enum)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、枚举是什么?
  • 二、使用步骤
    • 1.作用域
    • 2.隐式类型转换
    • 3.显式指定枚举值类型
    • 4.指定枚举值的值
    • 4.整形显式转换成枚举
  • 总结


前言

对于开发C++来说,枚举是一个几乎必然用到的功能。当然今天要讲的枚举肯定不是平常漫不经心的使用,而是从里到外地深扒它,逐渐揭开它神秘地面纱,发现一些未曾注意到地东西。


一、枚举是什么?

枚举(enumeration)类型用于存放用户指定的一组整数值(§iso.7.2)。枚举类型的每种取值各自对应一个名字,我们把这些值叫做枚举值(enumerator)。

二、使用步骤

枚举类型分为两种:

  1. enum class,它的枚举值名字位于enum的局部作用域内,枚举值不会隐式地转换成其他类型。
  2. 普通的enum,它的枚举值名字与枚举类型本身位于同一个作用域中,枚举值隐式地转换成整数。

普通枚举和类枚举最显著地差异是“作用域”不同和“隐式类型转换”,接下来我们分开讲。

1.作用域

  1. 枚举类

    枚举名字前面带class修饰符地枚举就是枚举类,它地成员作用域在enum内部,外部是不能直接访问的,需要通过类名::访问。举一个例子:

enum class Lights{red,green,yellow
};

你在类外面直接访问red或其它任何元素都是不行的,正确的访问方式是:

Lights::red

和类访问公有成员是一样的。

  1. 普通枚举

普通枚举就是不带class修饰符的枚举,它的枚举值名字与枚举类型本身位于同一个作用域中。不需要通过名字访问,举个例子:

    enum Lights{red, green,yellow};

访问方式和类枚举也有显著差别,直接使用枚举值名字就行了。

red
//或
Lights::red;

和在函数里访问一个局部变量是一样的,不需要显式指定枚举名字,也可以显式指定枚举名字,效果一样的。

  1. 未命名枚举
    还有一种枚举就是既不加class修饰,也不写枚举名字,而是只有枚举值,例如:
enum{red,green,yellow};

这种枚举访问方式和普通枚举一样,就是少了一个枚举名访问方式(因为没有名字,所以没法用名字访问)。

red

2.隐式类型转换

枚举常用一些整数类型表示,每个枚举值是一个整数。如果不显式指定枚举值,那么枚举值是默认从0开始的正整数。这一点对于所有的枚举类型都是一样的。

//枚举类
enum class Lights{
red,// 0
green,// 1
yellow// 2
};
//普通枚举
enum Lights{
red,// 0
green,// 1
yellow// 2
};
//未命名枚举
enum {
red,// 0
green,// 1
yellow// 2
};

不同的是使用class修饰的枚举类型,它的枚举值是不能隐式转换成其他类型的(这里是int)。比如:

//枚举类
int ecl = Lights::red;//这是错误的
//普通枚举
int el =  Lights::red;//这是正确的
//未命名枚举
int l = red;//这是正确的

3.显式指定枚举值类型

如果我们不显式指定枚举值类型,那么枚举值默认是带符号或无符号的整型。我们也可以显式指定枚举值类型为char或其他类型,例如:

enum class Lights:int{red,green,yellow};//sizeof(Lights) == 4
enum class Lights:char{red,green,yellow};//sizeof(Lights) == 1

4.指定枚举值的值

前面我们知道如果不显式指定枚举值的话,默认是int,而且值是从0开始的依次往后排的。也就是,第一个值是0,第二个是1,第三个是2…

enum class Lights{
red = 0,
green = 1,
yellow = 2
};

上面的效果和默认值是一样的。

还有一种方法是可以给枚举值指定负数,比如-1,考虑下面的代码:

enum class Lights{
red = -1,
green,
yellow
};

需要注意的是,上面red指定为-1,green没有指定值,那么green就是默认0,yellow就是1,依次递增。
不过这种命名方式多少有点不符合常理了,虽然语法上没有错,编译也不会报错,但是不建议这么用。就维持默认就行了。

4.整形显式转换成枚举

一个整数类型的值可以显式地转换成枚举类型。如果这个值属于枚举的基础类型的取值范围,则转换是有效的;否则,如果超出了合理的表示范围,则转换的结果是未定义的。考虑下面的例子:

    enum class Flag:char {x =1,y =2,z =4,e=8,f=127,g=128};Flag flag4 = static_cast<Flag>(5);Flag flag5 = static_cast<Flag>(999);

char的取值范围是-128-127,f=127的值是没问题的,但是g=128的值会引发窄化转换错误,从而导致编译报错。
再看下面的两个,虽然编译器不报错,但是5不是枚举里面的值,这么做失去意义;999严重超过char的取值范围,但是不会触发窄化转换的错误,导致未定义的行为。


总结

  1. 枚举值的默认值是有规律的,如果不能满足你的需求,就自定义值
  2. 建议使用枚举类,副作用比较小。主要是名字空间污染的问题,可能一不小心就会引发其他的问题。

相关文章:

C++枚举解读(enum)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、枚举是什么&#xff1f;二、使用步骤1.作用域2.隐式类型转换3.显式指定枚举值类型4.指定枚举值的值4.整形显式转换成枚举总结前言 对于开发C来说&#xff0…...

OSCP-课外5(Web图片泄露服务信息、日志中毒)

目录 一、主机发现与端口扫描 二、Web信息收集 三、系统信息收集与提权 一、主机发现与端口扫描...

汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)

一、ADD加法操作指令将eax置1&#xff0c;ebx置2&#xff0c;运行下面命令&#xff0c;将结果保存到eaxadd eax,ebx扩展&#xff1a;adc需要再加上CF标志位的值adc eax&#xff0c;ebx二、SUB减法操作指令将eax置3&#xff0c;ebx置2&#xff0c;运行下面命令&#xff0c;将结果…...

【电源专题】案例:充电芯片损坏为什么判断是从NTC进入的EOS

最近有发现一个异常就是测试部测试测试然后充电芯片就无法使用了。通过二极管特性分析(参考文章:电源专题】案例:电源芯片厂家怎么判断电源芯片端口是否损坏)是NTC管脚已经损坏对地短路了。但是以前没有发现这个问题,最近更换了芯片后就发现的特别明显。 首先分析一下现在…...

C语言中的数据储存规则

写在开头 关于复习的相关内容其实从一开始就列出了大纲&#xff0c;但是迟迟没有开始复习&#xff0c;一方面是因为学校学业却是繁忙&#xff0c;另一方面还是内心对旧知识掌握不熟练需要再学一遍的畏惧和懒惰&#xff0c;但如今&#xff0c;复习必须开始了。今天我从C语言的最…...

Android kotlin实战之协程suspend详解与使用

前言 Kotlin 是一门仅在标准库中提供最基本底层 API 以便各种其他库能够利用协程的语言。与许多其他具有类似功能的语言不同&#xff0c;async 与 await 在 Kotlin 中并不是关键字&#xff0c;甚至都不是标准库的一部分。此外&#xff0c;Kotlin 的 挂起函数 概念为异步操作提供…...

Pycharm中的Virtualenv Environment、Conda Environment

版本一 Conda Environment该不该选? 先说结论&#xff0c;该选&#xff0c;而且还是正解。前提是你打算"用Anaconda来管理各种Python环境&#xff0c;同时管理Python下面的各种包"。 选了Conda Environment意味着什么? 意味着你以后如果要装新的包的话&#xf…...

C++容器介绍:vector

目录vector简介使用方法1.头文件2.vector声明及初始化3.vector基本操作(1). 容量(2). 修改(3)迭代器(4)元素的访问(5)算法vector 简介 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vecto…...

抗锯齿和走样(笔记)

Artifacts&#xff08;瑕疵&#xff09;&#xff1a; 比如人眼采样频率跟不上陀螺的旋转速度&#xff0c;这时就有可能看到陀螺在反方向旋转怎么做抗锯齿&#xff08;滤波&#xff09;&#xff1a; 在采样之前先进行一个模糊操作&#xff0c;可以降低锯齿的明显程度 通过傅里叶…...

线程池的使用——线程池的创建方式

线程池的使用——创建线程线程池的创建线程池的创建方式Executors.newFixedThreadPool&#xff1a;Executors.newCachedThreadPool&#xff1a;Executors.newSingleThreadExecutor&#xff1a;Executors.newScheduledThreadPool&#xff1a;Executors.newSingleThreadScheduled…...

代码随想录算法训练营day47 |动态规划 198打家劫舍 213打家劫舍II 337打家劫舍III

day47198.打家劫舍1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组213.打家劫舍II情况一&#xff1a;考虑不包含首尾元素情况二&#xff1a;考虑包含首元素&#xff0c;不包含尾元素情况三&#x…...

项目设计模式和规范

1、责任链模式 自己的理解:避免发生方与接收方解耦 优点:①降低发送方与接收方的耦合 ②简化他们对象 ③方便扩展新增 处理者 缺点:①不方便排错 ②性能问题,且使用不当容易搞出死循环 应用场景:拦截器 Interceptor和过滤器 filter:符合模式的进行拦截或者过滤到,然…...

无线WiFi安全渗透与攻防(一)之无线安全环境搭建

无线安全环境搭建 1.802.11标准 &#xff08;1&#xff09;.概念 802.11标准是1997年IEEE最初制定的一个WLAN标准&#xff0c;工作在2.4GHz开放频段&#xff0c;支持1Mbit/s和2Mbit/s的数据传输速率&#xff0c;定义了物理层和MAC层规范&#xff0c;允许无线局域网及无线设备…...

【matplotlib】可视化解决方案——如何解决matplotlib中文乱码问题

问题概述 Matplotlib 默认不支持中文字体&#xff0c;这是因为 matplotlib 只支持 ASCII 字符&#xff0c;但是国人使用 matplotlib 肯定需要中文标注。如下图所示&#xff0c;当不对 Matplotlib 进行设置&#xff0c;而直接使用中文时&#xff0c;绘制的图像会出现中文乱码。…...

JAVA开发中GC日志打印简单通用的配置详解

如何配置一个完美的JVM日志打印信息 打印内容 打印基本的GC信息 打印对象分布情况 GC后打印堆数据 打印STW时间 打印safepoint信息 打印Reference处理信息 综上所述&#xff0c;最终的参数如下&#xff1a; 还有哪些问题呢&#xff1f;是不是有文件输出更好&#xff1f; 打印日…...

十进制的小数如何转二进制?二进制表示的小数如何转十进制?

😄 基础不牢,地动山摇~ 补补基础~ 文章目录 1、十进制的小数转二进制?2、二进制表示的小数转十进制?3、做道coding题巩固下:1、十进制的小数转二进制? 整数部分: 用普通的二进制表示即可。小数部分: 首先,将小数部分乘以2,取出整数部分作为二进制表示的第1位;然后…...

klipper使用webcam设置多个摄像头方式

一、前言 使用klipper设置多个摄像头&#xff0c;折腾了好些天&#xff0c;网上资料很少&#xff0c;这里写一个帖子记录一下 二、环境 参考链接&#xff1a;https://www.cnblogs.com/sjqlwy/p/klipper_webcam.html 我的klipper安装在香橙派上面&#xff0c;系统是debian&a…...

风力发电机组浪涌保护器安全防护方案

风机的庞大与危险高空作业注定了其在基建和维护中不易操作&#xff0c;风机设备的主电源、过程控制、网络与通讯、现场设备需要高等级的防雷浪涌保护器冲击保护&#xff0c;提高系统及设备的可靠性和可用性。风电场的主要发电设备风力发电机组“大风车”是风电场的主要发电设备…...

【剑指offer】JZ7 重建二叉树、JZ9 用两个栈实现队列

\描述&#xff1a; 给定节点数为 n 的二叉树的前序遍历和中序遍历结果&#xff0c;请重建出该二叉树并返回它的头结点。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建出如下图所示。 思路&#xff1a; 题上给了我们前序遍历(根 …...

ElasticSearch - SpringBoot整合ES之查询所有 match_all

文章目录1. 数据准备2. 全量查询 match_all3. 使用 boost 参数更改 _score官方文档地址&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/index.html权威指南&#xff1a;https://www.elastic.co/guide/cn/elasticsearch/guide/current/structured-search…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...