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

【C++11 之强类型枚举enum class/struct 基本结构及应用场景】了解在enum基础上增加了什么

C++11 中的强类型枚举(也称为枚举类)通过 enum class 或 enum struct 关键字来定义。它们的基本结构与传统枚举(通过 enum 定义)相似,但在类型安全性和作用域上有所不同。以下是强类型枚举的基本结构代码说明及解析:

基本结构

// 声明一个名为 Color 的强类型枚举,底层类型为 unsigned int  
enum class Color : unsigned int {  RED,    // 枚举值,通常是大写的  GREEN,  BLUE,  // 可以有其他枚举值  
};  // 使用枚举类  
int main() {  Color myColor = Color::RED; // 使用枚举类的作用域解析运算符 :: 来指定枚举值  // ... 其他代码 ...  return 0;  
}

解析

  1. 关键字:enum class 或 enum struct 用于声明强类型枚举。实际上,enum struct 和 enum class 在 C++ 中是等价的。
  2. 枚举名:在这个例子中,枚举名是 Color。你可以根据需要选择任何合法的标识符作为枚举名。
  3. 底层类型:: unsigned int 指定了枚举的底层类型为 unsigned int。如果不指定底层类型,则默认为 int。选择适当的底层类型可以优化内存使用和提高性能。
  4. 枚举值:枚举值(如 RED、GREEN、BLUE)是枚举类型的成员。它们通常是大写的,以增加代码的可读性。每个枚举值在底层类型上都有一个唯一的值。默认情况下,第一个枚举值从 0 开始,后续枚举值依次递增。但是,你也可以显式地为枚举值指定值。
  5. 作用域:强类型枚举的成员(即枚举值)具有枚举类型的作用域。这意味着你不能在枚举类型的作用域之外直接使用枚举值,除非使用枚举类型名和作用域解析运算符 :: 来指定它们。这有助于减少命名冲突和提高代码的可读性。
  6. 类型安全性:强类型枚举具有更高的类型安全性。它们不会隐式地转换为其他类型(如 int),这有助于防止意外的类型转换和类型错误。如果需要将强类型枚举值转换为其他类型,必须显式地使用类型转换运算符(如 static_cast)。

应用场景

  1. 避免隐式转换:当不希望枚举值被隐式转换为其他类型(如整型)时,强类型枚举是一个很好的选择。
  2. 减少命名冲突:在大型项目中,不同的枚举类型可能包含相同的枚举值。使用强类型枚举可以避免这种命名冲突。
  3. 提高代码可读性:通过为枚举值提供明确的类型,可以使代码更具可读性。

案例

  1. 假设我们有一个表示颜色的枚举类型:
	enum class Color {  RED,  GREEN,  BLUE  };
  1. 使用强类型枚举时,你需要指定类型前缀来访问枚举值,如下所示:
	Color color = Color::RED;
  1. 此外,由于强类型枚举不会隐式地转换为整型,因此以下代码将导致编译错误:
	int num = Color::RED; // 编译错误
  1. 但你可以通过显式转换来实现这一点:
	int num = static_cast<int>(Color::RED); // 正确
  1. 你还可以显式地为枚举值指定值:
enum class Color : unsigned int {  RED = 1,  GREEN = 2,  BLUE = 4,  // 注意:这些值通常是用于位运算的,所以它们通常是 2 的幂  
};

在这个例子中,RED 的值为 1,GREEN 的值为 2,BLUE 的值为 4。这种设计通常用于位运算,允许你使用按位或(|)运算符组合多个颜色值。例如,Color(RED | BLUE) 将表示同时包含红色和蓝色的颜色。但是,请注意,这种用法需要谨慎处理,并确保底层类型具有足够的位来表示所有可能的组合。

  1. 此外,由于强类型枚举具有作用域,因此你可以定义具有相同枚举值的两个不同枚举类型而不会引起冲突:
	enum class Direction {  UP,  DOWN  };  enum class TrafficLight {  RED, // 不会与Color::RED冲突  YELLOW,  GREEN  };

在这个例子中,Direction::UP、Color::RED和TrafficLight::RED是三个完全不同的枚举值,分别属于不同的枚举类型。

总结:强类型枚举(通过 enum class 或 enum struct 定义)确实增加了类型限制和作用域限制,从而提高了代码的类型安全性和可读性。

相关文章:

  • 水系统阻力计算
  • git log 过滤
  • Redis的实战常用一、验证码登录(解决session共享问题)(思路、意识)
  • 数据仓库之离线数仓
  • Android系统 无法绑定1024以下端口问题
  • 力扣每日一题 6/22 字符串/贪心
  • 【太原理工大学】软件系统安全—分析题
  • 【自动驾驶技术】自动驾驶汽车AI芯片汇总——TESLA篇(FSD介绍)
  • 邻接矩阵实现
  • 【D3.js in Action 3 精译】关于本书
  • 天津媒体邀约,及媒体名单?
  • 微软修复Wi-Fi驱动高危漏洞 影响Windows所有版本 可通过局域网发起攻击
  • 结硬寨:联想服务器的向前之路
  • 与Vatee万腾平台同行,共创智能未来
  • 网络编程之XDP技术的基础eBPF
  • Docker入门(二) - Dockerfile
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • iOS | NSProxy
  • Java IO学习笔记一
  • Java深入 - 深入理解Java集合
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • node 版本过低
  • React的组件模式
  • webpack入门学习手记(二)
  • windows下使用nginx调试简介
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 今年的LC3大会没了?
  • 聚类分析——Kmeans
  • 排序算法之--选择排序
  • 全栈开发——Linux
  • 使用common-codec进行md5加密
  • 小程序01:wepy框架整合iview webapp UI
  • 中文输入法与React文本输入框的问题与解决方案
  • Spring Batch JSON 支持
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • $NOIp2018$劝退记
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (苍穹外卖)day03菜品管理
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)PySpark3:SparkSQL编程
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)计算机毕业设计大学生兼职系统
  • (一)VirtualBox安装增强功能
  • (轉貼) UML中文FAQ (OO) (UML)
  • *2 echo、printf、mkdir命令的应用
  • ./configure,make,make install的作用(转)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • /run/containerd/containerd.sock connect: connection refused