C++中的enum(枚举)是什么,以及与C中enum的不同之处

最近在看《A Tour of C++ 3rd》的时候发现 C 和 C++ 的 enum虽然使用起来比较相似,但是目的却略有不同。关于枚举的概念还请见之前写过一篇关于 C 的那篇博客《C语言中enum(枚举)详解》,这里不再赘述。本文侧重 C++ 与 C 不同的地方。

首先,默认情况下与 C 一样,值的类型为整数,所以下面样式的代码依旧可以使用:

#include <iostream>enum {Jan=1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};int main()
{int x1 = Jan;std::cout<<x1<<std::endl;
}

C++ 不同版本的枚举使用方法也有所不同,但是上面这种“plain”版本的都是一样的。所以本文不会详细介绍 C++11 到 C++23 每个版本的使用方法,主要是介绍概念(因为这个概念我花了一段时间才搞明白)。

但是《A Tour of C++ 3rd》和《The C Programming Language》这两本书对于枚举的目的描述却不太一样。

在《The C Programming Language》中,enum被描述成一种“常量列表”;但是在《A Tour of C++ 3rd》中,enum则被描述成一种用户定义类型的简单方式,相比 C 的enum扩充了一些功能。

C++11 添加了作用域内枚举enum class,有时候枚举可能会重名,这样就可以解决重名的问题了。如下:

enum class Color { red, blue, green };
enum class Light { red, blue, green };

要牢记enum class是一个整体,含义是创建一个class一样的枚举,也就是说class后面的是一个自定义的类型,而大括号内的是这个“类”的域

当我们要使用上面Color中的red时,需要按照表示red所属的是哪个enum class

std::cout<<int(Color::red);
//OutPut:0

这里将Color转换成基础数据类型,会发现也还是0。但是需要注意,这里依旧和 C 中一样,Color::red表示的是Colorred, blue, green三者中的red这个常量,并不是类或结构体中的成员变量,这是非常容易混淆的一点

如果使用了enum class,虽然可以赋值、初始化、比较,但是就不能像 C 那样简单地输出这些枚举常量了,需要将其转换成基础数据类型(默认为整数)或者自己写输出功能。但是我们可以用enum class创建的类型来创建新的常量:

Color x = Color::red;
std::cout<<int(x);
//OutPut:0

这里的x会被认为和Color::red是一类的,二者可以比较,如下:

if (x == Color::red) {std::cout<<"x等于Color::red";    
}
//x等于Color::red

如果你看了我 C 的那一篇博客的话,最后提到枚举的一个用途就是对比(比如作为if的判断部分)。所以 C++ 默认支持的三个功能之一就是比较。而且我们可以指定值来创建常量,方法如下(二者等价,但是不同版本 C++ 可能会不同):

Color x = Color(10);	//C++11及更新版本
Color x {10};			//C++17及更新版本

这样x就是和Color::red是一个类型的常量,二者可以互相比较,但值为10。这种方法虽然变得复杂了一些,但可以比较灵活地实现一些情况的判断。

书中给出了一个红绿灯的例子挺有意思的。(下面我修改了一些地方,不是书中的,但是思路一样)。

首先重载++x操作符:

Color& operator++(Color& c)
{using enum Color;	//这个要C++20switch (c) {case red:   return c=blue;case blue:   return c=green;case green:   return c=red;}
}

然后就可以通过++x获取到枚举列表的下一个元素:

Color x = Color::red;
std::cout<<int(x)<<std::endl;
std::cout<<int(++x)<<std::endl;

希望能帮到有需要的人~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/856217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue56-组件的自定义事件

一、什么是自定义事件 二、子组件—【传值】—>父组件 2-1、prop属性 2-2、自定义事件 v-on在谁身上&#xff0c;就给谁绑定事件&#xff01; 给谁绑定的事件&#xff0c;想触发就找谁&#xff01; 2-3、prop属性VS自定义属性 2-4、简写形式 2-5、ref属性实现 加了ref属性…

软件监控发展简史

软件监控简史&#xff0c;从 00 年代开始。发生了什么变化&#xff1f;为什么事情变得如此神秘&#xff1f; 终端设备上日益重要的用户体验通过边缘计算和分布式计算不断得到改善。然而&#xff0c;服务质量的测量仍然使用基于服务器的原语进行。 我们的 2000 年软件监控是这样…

wvp-GB28181-pro 源码分析-服务启动流程及IPC注册(一)

文章目录 启动顺序1、VManageBootstrap文件中的main2、优先加载的bean3、gb28181/SipLayer.java4、media/MediaServerConfig.java5、conf/SipPlatformRunner.java6、gb28181/task/SipRunner.java2024年6月20日下载的wvp-GB28181-pro,版本号为2.7.2,使用ZLMediakit主干版本。 …

程序员兼职接单有哪些渠道?一篇文章带你了解!

2024年&#xff0c;程序员兼职接单别只盯着朋友圈啦&#xff01;这些兼职接单渠道你一个都不容错过&#xff01;想要通过兼职接单获取收入的程序员&#xff0c;一定不能错过这篇文章&#xff01; 程序员兼职接单的渠道可以简单的分类为兼职平台和程序员论坛和自身人脉拓展三个…

【SD3辅助工具推荐】InstantX发布了三种SD3专属的ControlNet模式——Pose、Canny和Tile

InstantX 是一家专注于人工智能内容生成的独立研究机构。此前&#xff0c;曾开源著名的InstantID和论文《InstantID : Zero-shot Identity-Preserving Generation in Seconds》。随着本月12号&#xff0c;Stability AI正式开源了其产品 Stable Diffusion 3&#xff0c;这家机构…

吃透Flink State面试题和参考答案

目录 什么是 Flink 中的状态(State)? Flink 支持哪两种状态类型? 解释一下什么是 Keyed State 和 Operator State。 Flink 中的状态是如何存储的? 什么是 Flink 的状态后端(State Backend)? 比较 MemoryStateBackend、FsStateBackend 和 RocksDBStateBackend 的区…

js笔试题目2024

字符串按字符出现频次排序 "Aacbbcc" 输出 "cccbbAa" const s "Aacbbcc"function setString(string) {const map new Map();let res for(let char of string){const val map.get(char)map.set(char, val?val 1:1)}const arr Array.from(m…

(1)ubuntu g++使用

文章目录 g流程常用示例 g流程 预处理->编译->汇编->链接预处理: 展开头文件&#xff0c;宏替换&#xff0c;去除注释&#xff0c;条件编译 g -E test.cpp -o test.i -E 只进行预编译&#xff0c; 生成真正的源代码.i文件编译&#xff1a;检查语法&#xff0c;生成汇…

高效设计必选!5款好用的UI动效工具

UI 动态设计是应用程序设计的重要组成部分。随着技术的积累&#xff0c;UI设计中的动态效果遍地开花&#xff0c;UI动态效果可以使我们的页面更时尚、更有趣、更人性化。5G网络的快速发展也使美丽的动态效果几乎无缝地嵌入到UI界面中。今天&#xff0c;毫不夸张地说&#xff0c…

极氪与 TDengine 合作建设新一代车联网云端基础平台

在车联网场景中&#xff0c;智能车辆通过各种传感器按时采集车辆状态信息&#xff0c;包括但不限于行驶速度、发动机转速、轮胎压力、里程等。此外&#xff0c;某些事件触发后会生成车辆事件数据&#xff0c;例如门锁状态变化、碰撞、异常移动等。每次数据上报都包含时间戳&…

Visual Studio2022+cuda环境配置及代码调试

环境配置 下载并安装CUDA Toolkit 打开Visual Studio&#xff0c;新建项目。如下图所示&#xff0c;已经包含CUDA编程选项 代码调试 1、打开cu文件的属性页&#xff0c;按下图所示&#xff0c;将Host中的Generate Host Debug Information设置为“是" 2、不可勾选Nsight…

揭秘网络安全攻防战

网络安全攻防战综述 网络安全攻防战概念 网络安全攻防战是指在网络空间中&#xff0c;攻击者和防御者之间的持续斗争。攻击者&#xff08;黑客&#xff09;利用各种手段企图突破防御&#xff0c;窃取信息、破坏系统&#xff0c;而防御者则采取各种措施保护网络安全&#xff0…

ARM功耗管理框架之LPI

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理框架&#xff1f;SCP&#xff1f;PPU&#xff1f;LPI&#xff1f;之间的关系&#xff1f;如何配合&#xff1f; 目录 一、功耗管理框架中的LPI 二、LPI分类 三、Q-Channel和P-Channel对比 四、Q-Channel和P-Ch…

网络故障排查-TCP标志位

目录 1. SYN&#xff08;Synchronize&#xff09; 2. SYN-ACK&#xff08;Synchronize-Acknowledge&#xff09; 3. FIN&#xff08;Finish&#xff09; 4. RST&#xff08;Reset&#xff09; 故障排除步骤 网络流量分析仪中的TCP标志位&#xff08;SYN、SYN-ACK、FIN、RS…

第28讲:Ceph集群使用RBD块存储与K8S Volumes集成

文章目录 1.Ceph集群使用RBD块存储与K8S集成简介2.Ceph集群RBD块存储与K8S Volume集成2.1.在Ceph集群中创建K8S集群使用的块存储2.2.创建用于K8S访问Ceph RBD块设备的认证用户2.3.将认证用户的Key存储在K8S Secret资源中2.4.在K8S集群的所有节点中安装Ceph命令2.5.创建Pod资源使…

【uni-app学习手札】

uni-app&#xff08;vue3&#xff09;编写微信小程序 编写uni-app不必拘泥于HBuilder-X编辑器&#xff0c;可用vscode进行编写&#xff0c;在《微信开发者工具》中进行热加载预览&#xff0c; 主要记录使用uni-app过程中自我备忘一些api跟语法&#xff0c;方便以后编写查找使用…

【React 】折叠面板,点击展开时再请求数据

需求背景&#xff1a;使用折叠面板的形式展示数据&#xff0c;面板内部数据需要在打开时请求接口获取。 遇到问题&#xff1a;最开始使用Antd 的折叠面板组件&#xff0c;它对于数据直接渲染是没问题的&#xff0c;但是不好满足打开面板时再动态加载数据的需求&#xff0c;于是…

计算机视觉与深度学习实战,Python为工具,基于Simulink进行图像和视频处理

计算机视觉与深度学习是当代人工智能领域的两大热门技术,它们在图像识别、目标检测、视频分析等领域展现出巨大的潜力和应用价值。Python作为一种强大的编程语言,结合深度学习框架和Simulink等工具,为计算机视觉和深度学习的研究与实践提供了丰富的资源和平台。以下将结合Py…

JAVA中EasyPoi导出word文档附带表格数据

导入easy-poi相关依赖 <!-- word导出 方式&#xff1a;easypoi --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.4.0</version></dependency><dependency><…

VBA学习(12):制作动态模糊匹配的下拉菜单

今天就再给大家分享一下&#xff0c;如何使用VBA制作更好用的动态模糊匹配下拉菜单。 完成后的效果演示如下&#xff1a; 如上图所示&#xff0c;点击A列单元格&#xff0c;Excel会自动跳出一个文本输入框和一个列表框。当在文本框中输入数据时&#xff0c;列表框的数据会随之…