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

devtools/2024/9/23 2:00:32/
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 定义)确实增加了类型限制和作用域限制,从而提高了代码的类型安全性和可读性。


http://www.ppmy.cn/devtools/53978.html

相关文章

物联网LORA技术-SX1276/SX1277/SX1278-137MHz至1020MHz低功耗远距离收发器

概述&#xff1a; SX1276/SX1277/SX1278 收发器主要采用LORATM 远程调制解调器&#xff0c;用于超长距离扩频通信&#xff0c;抗干扰性强&#xff0c;能够最大限度降低电流消耗。借助升特的LoRaTM 专利调制技术&#xff0c;SX1276/SX1277/SX1278 采用低成本的晶体和物料即可获得…

Web Workers 与 DOM:异步处理与用户界面的和谐共存

在现代Web应用开发中&#xff0c;处理复杂的计算任务与维护流畅的用户界面体验是两大核心挑战。HTML5引入的Web Workers为解决这一难题提供了有效途径&#xff0c;它允许在后台线程执行脚本&#xff0c;从而避免了长时间运行的计算任务阻塞用户界面&#xff08;UI&#xff09;线…

【Qt基础教程】事件

文章目录 前言事件简介事件示例总结 前言 在开发复杂的图形用户界面(GUI)应用程序时&#xff0c;理解和掌握事件处理是至关重要的。Qt&#xff0c;作为一个强大的跨平台应用程序开发框架&#xff0c;提供了一套完整的事件处理系统。本教程旨在介绍Qt事件处理的基础知识&#x…

展厅装修时候需要注意哪些细节

1、视觉方面 展厅应该具有很强的视觉冲击力。只有这样不论是领导视察还是合作的客户进行参观的时候才会对展厅产生浓厚的兴趣&#xff0c;同时产生一种亲和力&#xff0c;并直接加深对企业的识别度和记忆度。而个性化设计要跟企业文化相符合。这里&#xff0c;企业标志为寻求个…

Python入门指南:从基础到高级

一、引言 1.1 Python编程语言简介 一、起源与发展 Python由荷兰计算机科学家吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;于1990年代初设计&#xff0c;作为ABC语言的一种替代品。 1991年发布了Python的第一个版本&#xff08;0.9.0&#xff09;。 2000年发布了Py…

高考志愿填报,如何权衡学校和专业?

高考是人生的分水岭&#xff0c;成绩好的学生能就读更好的大学&#xff0c;获得更多的学习资源&#xff0c;但也有一些同学即使凭借高分数进入了高校&#xff0c;专业的学习过程却不尽如人意&#xff0c;他们也没有将100%的精力投入到专业学习当中。 无论高考结束之后获得了多…

数据资产安全保卫战:构建多层次、全方位的数据安全防护体系,守护企业核心数据资产安全

一、引言 在信息化时代&#xff0c;数据资产已成为企业运营的核心&#xff0c;其安全性直接关系到企业的生存与发展。然而&#xff0c;随着网络技术的飞速发展&#xff0c;数据泄露、黑客攻击等安全威胁日益增多&#xff0c;给企业的数据资产安全带来了严峻挑战。因此&#xf…

function包装器和bind包装器

function包装器和bind包装器 包装器function包装器为什么需要functionfunction包装器function包装器的应用场景逆波兰表达式求值 bind包装器bind包装器的应用场景 包装器 包装器是用于给其他编程接口提供更一致或更合适的接口 由于函数调用可以使用函数名、函数指针、函数对象…