C++:枚举类的使用案例及场景

一、使用案例

在C++中,枚举类(也称为枚举类型或enum class)是C++11及以后版本中引入的一种更加强大的枚举类型。与传统的枚举(enum)相比,枚举类提供了更好的类型安全性和作用域控制。下面是一个使用枚举类的案例,这个案例模拟了一个简单的交通灯系统。

#include <iostream>  // 定义一个枚举类来表示交通灯的状态  
enum class TrafficLight {  RED,    // 红灯  YELLOW, // 黄灯  GREEN    // 绿灯  
};  // 一个函数,用于打印当前交通灯的状态  
void printTrafficLight(TrafficLight light) {  switch (light) {  case TrafficLight::RED:  std::cout << "红灯亮,请停车等待" << std::endl;  break;  case TrafficLight::YELLOW:  std::cout << "黄灯亮,请准备停车" << std::endl;  break;  case TrafficLight::GREEN:  std::cout << "绿灯亮,可以通行" << std::endl;  break;  default:  std::cout << "未知状态" << std::endl;  }  
}  int main() {  // 使用枚举类  TrafficLight currentLight = TrafficLight::RED;  printTrafficLight(currentLight);  // 尝试修改交通灯状态  currentLight = TrafficLight::GREEN;  printTrafficLight(currentLight);  // 尝试隐式转换(这是不允许的,因为使用了enum class)  // 下面的代码会编译失败  // printTrafficLight(2); // 错误:无法从'int'转换为'TrafficLight'  return 0;  
}

在这个例子中,TrafficLight是一个枚举类,它有三个成员:REDYELLOWGREEN,分别代表交通灯的不同状态。printTrafficLight函数接受一个TrafficLight类型的参数,并根据参数的值打印出相应的状态信息。

与普通的枚举(enum)相比,enum class提供了更强的类型检查。在上面的代码中,如果你尝试将整数直接传递给printTrafficLight函数(如printTrafficLight(2);),编译器会报错,因为enum class类型的值不能直接由整数隐式转换而来,这有助于减少因类型不匹配而导致的错误。

此外,由于enum class的成员默认是private的,它们的作用域被限制在枚举类内部,这有助于避免命名冲突,并提高了代码的可读性和可维护性。在需要时,可以通过::操作符来访问枚举类的成员,如TrafficLight::RED

二、使用场景

枚举类(enum class)的主要目的和优点包括:

  1. 类型安全:与传统的枚举(enum)相比,枚举类提供了更强的类型安全性。枚举类的成员不会隐式地转换为整数或与其他枚举类型的成员进行比较,这有助于减少因类型不匹配而导致的错误。

  2. 作用域控制:枚举类的成员默认具有枚举类的作用域,这有助于避免命名冲突。要使用枚举类的成员,通常需要使用枚举类名和::操作符(例如TrafficLight::RED)。

  3. 可定义性和可扩展性:枚举类可以像其他类一样,拥有成员函数(包括构造函数、析构函数和操作符重载等)。这提供了更多的灵活性和可扩展性。

  4. 清晰的语义:枚举类提供了一种将一组命名的整数常量组织在一起的方式,使得代码更加清晰易懂。枚举类的成员名通常能够清晰地表达其代表的语义。

然而,枚举类声明的对象并不仅限于与枚举类内部定义的数据进行对比。它们还可以用于各种需要这些枚举值的场景,比如:

  • 作为函数的参数或返回值,以指示函数的状态或执行的结果。
  • 作为类的成员变量,以表示对象的状态或属性。
  • 在条件语句(如ifswitch)中作为条件表达式,以根据枚举值执行不同的代码路径。
  • 在循环中作为迭代器的值,尽管这种情况较少见,但在某些特定场景下可能会用到。

因此,虽然将枚举类声明的对象与枚举类内部定义的数据进行对比是枚举类的一种常见用法,但枚举类的用途远不止于此。

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

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

相关文章

(linux系统服务)Linux下yum源配置实战

一、Linux下软件包的管理 1、软件安装方式 ① RPM包管理&#xff08;需要单独解决依赖问题&#xff09; ② YUM包管理&#xff08;需要有网络及YUM仓库的支持&#xff0c;会自动从互联网下载软件&#xff0c;自动解决依赖&#xff09; ③ 源码安装&#xff08;安装过程比较…

总体设计在软件设计中的意义

总体设计&#xff08;High-Level Design, HLD&#xff09;是软件开发生命周期中的一个关键阶段&#xff0c;旨在从宏观层面定义系统的结构和主要组件。总体设计的目标是为详细设计和实现提供一个清晰的框架和蓝图。 总体设计的意义 明确系统架构&#xff1a;总体设计帮助开发…

基于Java的外卖点餐系统设计与实现

作者介绍&#xff1a;计算机专业研究生&#xff0c;现企业打工人&#xff0c;从事Java全栈开发 主要内容&#xff1a;技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流&#xff08;SCI论文两篇&#xff09; 上点关注下点赞 生活越过…

深⼊理解 JVM 底层原理、垃圾回收机制,能通过mat、jstat进行JVM参数调优

深入理解JVM&#xff08;Java虚拟机&#xff09;底层原理和垃圾回收机制是Java开发者和系统管理员的重要技能&#xff0c;尤其是在性能调优方面。下面是一些关键点&#xff0c;帮助你更好地理解这些概念&#xff1a; ### JVM 底层原理 1. **类加载机制**&#xff1a;JVM如何加…

java+mysql教师管理系统

完整源码地址 教师信息管理系统使用命令行交互的方式及数据库连接实现教师信息管理系统&#xff0c;该系统旨在实现教师信息的管理&#xff0c;并根据需要进行教师信息展示。该软件的功能有如下功能 (1)基本信息管理(教师号、姓名、性别、出生年月、职称、学历、学位、教师类型…

25西安电子科技大学研究生政策(最新)

25西安电子科技大学研究生政策&#xff08;最新&#xff09; 01全国研究生报名情况 全国研究生报名人数438万&#xff0c;首次下降超36万人。 02西电研究生全日制/非全日制报名情况 西电硕士研究生报考录取情况&#xff08;包含全日制、非全日制&#xff09;&#xff0c;2024年…

python-数据容器对比总结

基于各类数据容器的特点&#xff0c;它们的应用场景如下&#xff1a; 数据容器的通用操作 - 遍历 数据容器的通用统计功能 容器的通用转换功能 容器通用排序功能 容器通用功能总览

C-特性和新特性

C特性和新特性 C11 C11是C编程语言的一个重要标准版本&#xff0c;是C98标准发布后13年来的第一次重大修正&#xff0c;它引入了许多新特性和改进&#xff0c;极大地增强了C语言的表达能力和开发效率。 C11是C编程语言的一个重要标准版本&#xff0c;由国际标准化组织(ISO)和…

如何在Java中实现自定义数据结构:从头开始

如何在Java中实现自定义数据结构&#xff1a;从头开始 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Java中实现自定义数据结构&#xff…

一文彻底搞懂Transformer - Input(输入)

一、输入嵌入&#xff08;Input Embedding&#xff09; 词嵌入&#xff08;Word Embedding&#xff09;&#xff1a;词嵌入是最基本的嵌入形式&#xff0c;它将词汇表中的每个单词映射到一个固定大小的向量上。这个向量通常是通过训练得到的&#xff0c;能够捕捉单词之间的语义…

HTTP入门

入门HTTP协议 1. 原理介绍 爬虫就是用程序模拟浏览器的行为&#xff0c;发送请求给服务器&#xff0c;获取网页的内容&#xff0c;解析网页数据。 要学会爬虫&#xff0c;先要了解浏览器是如何和服务器交流的。浏览器通过HTTP协议和服务器交流。 2. HTTP协议简介 2.1…

第4篇 区块链的优势与挑战:为什么区块链如此重要?

区块链听起来像是一种高科技的魔法&#xff0c;很多人都想知道它到底是怎么回事&#xff0c;为什么会引起如此大的关注。今天&#xff0c;我们就来揭开区块链的神秘面纱&#xff0c;看看它的优势和挑战&#xff0c;顺便聊聊为什么它会变得如此重要。 优势篇 1. 去中心化&…

【pg】去除pg数据库字段值中的空格

如何批量去除PostgreSQL数据库字段值中的空格 在处理数据库中的数据时&#xff0c;经常会遇到字段值末尾带有多余空格的问题。这些空格可能是用户输入错误或数据迁移过程中引入的&#xff0c;可能会影响数据的准确性和一致性。本文将介绍如何使用 PostgreSQL 的 SQL 语句批量去…

The Forest Enemy Pack(2D动画角色游戏模型)

这个包包含14个适用于platformer和2d rpg游戏的动画角色。 动画总帧数:1785 用于动画的所有精灵都具有透明背景,并准备有1500x1200和750x600两种尺寸。 对于每个角色,你也可以找到具有单独身体部位的精灵表,这样你就可以轻松地制作自己的动画。它们有PNG和PSD格式。 示例场…

对MVC的理解以及如何实现一个简单的MVC

IOC 容器与 Controller&#xff1a; 在 Spring 框架中&#xff0c;所有的 Controller 都会被 Spring 的 IOC 容器管理。当应用程序启动时&#xff0c;Spring 会扫描所有带有 Controller 注解的类&#xff0c;并将它们作为 Bean 注册到 IOC 容器中。 方法扫描与 Dispatcher&am…

强化学习-5 策略梯度、Actor-Critic 算法

文章目录 1 基于价值&#xff08; value-based \text{value-based} value-based &#xff09;算法的缺点2 策略梯度算法2.1 解释2.1.1 分母和分子相消2.1.2 对数函数的导数2.1.3 组合公式2.1.4 总结 3 REINFORCE算法4 策略梯度推导进阶4.1 平稳分布4.2 基于平稳分布的策略梯度…

Python游戏脚本开发之大漠插件

自动化 文章目录 自动化前言一、开发环境二、免注册调用三、创建大漠对象四、注册五、大漠功能调用六、整体代码 前言 大漠插件是集前后台&#xff0c;文字识别&#xff0c;图色&#xff0c;键鼠&#xff0c;窗口&#xff0c;内存&#xff0c;DX&#xff0c;Call等功能于一身的…

HSP_13章 Python_魔术方法

文章目录 P132 魔术方法1. 魔术方法的基本介绍2. 常见的魔术方法2.1 __str__2.2 __eq__2.3 其它的几个魔术方法 P132 魔术方法 参考文档 1. 魔术方法的基本介绍 2. 常见的魔术方法 2.1 str # 请输出Monster[name&#xff0c;job&#xff0c;sal]对象的属性信息 #可以根据需要…

(1, ‘[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1124)

WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by SSLError(SSLError(1, [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1124))): /pypi/simple/urllib3/ pip install的时候遇到这个错误 第一步…

竞赛选题 交通目标检测-行人车辆检测流量计数 - 竞赛选题

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…