C++基础整理(9)之强枚举类,enum class的意义

2024-04-19 18:20

本文主要是介绍C++基础整理(9)之强枚举类,enum class的意义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++基础整理(9)之强枚举类,enum class的意义

注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构


C++ 的 强枚举

  • C++基础整理(9)之强枚举类,enum class的意义
  • 一、强枚举(enum class)
    • 1、基本语法
    • 2、特性与优点
    • 3、注意事项
  • 二、回顾普通的枚举enum
    • 1、传统枚举(enum)
  • 总结


提示:本文为 C++ 中 强枚举类定义、写法和举例


一、强枚举(enum class)

  enum class 是 C++11 引入的一种强类型枚举(也称为作用域枚举类枚举),它提供了一种更安全、更易于管理的枚举类型。与传统的 enum 相比,enum class 提供了更好的类型安全和更清晰的作用域规则。强类型枚举不会隐式转换为整数或其他类型,需要使用显式的类型转换。同时,枚举器的名称也只在枚举类型的作用域内可见

1、基本语法

enum class Color {  RED,  GREEN,  BLUE  
};

2、特性与优点

类型安全:enum class 枚举类型的值不会隐式地转换为整数或其他枚举类型。如果需要转换,必须显式地进行。这有助于防止意外的类型转换错误。

Color c = Color::RED;  
int i = static_cast<int>(c); // 显式转换

作用域明确:enum class 的枚举器(即枚举值)具有明确的作用域,需要使用枚举类型名和作用域解析运算符 :: 来访问。这避免了名称冲突,并使得代码更加清晰。

Color c = Color::RED; // 正确  
Color d = RED; // 错误,因为 RED 不在当前作用域中

更好的底层类型控制:你可以为 enum class 指定底层类型(用一个:),以控制枚举值的存储大小和范围。

enum class Color : uint8_t {  //指定底层类RED,  GREEN,  BLUE  
};

可前向声明:与传统的 enum 不同,enum class 可以被前向声明,这使得它可以在头文件中仅声明而在源文件中定义,从而实现更好的模块化和封装。

// 头文件  
enum class Color;  // 源文件  
enum class Color {  RED,  GREEN,  BLUE  
};

更好的调试体验:在调试器中,enum class 的值通常会显示为它们的名称,而不是整数,这使得调试更加直观。

3、注意事项

由于 enum class 提供了更强的类型安全性,因此与传统的 enum 相比,使用它时可能会需要更多的显式转换。
在某些情况下,如果你需要枚举值与整数之间的隐式转换,或者需要在多个枚举类型之间共享枚举值,那么传统的 enum 可能更合适。

二、回顾普通的枚举enum

1、传统枚举(enum)

传统枚举在C++98及之前的版本中定义,它们允许隐式转换为整数,并且枚举器的名称在枚举类型的作用域内是可见的。

enum Color { RED, GREEN, BLUE };  int main() {  Color c = RED; // 正确  int i = c;     // 隐式转换为整数,也是正确的  Color d = 2;   // 也是正确的,但可能不是期望的行为  return 0;  
}

由于传统枚举可以隐式转换为整数,并且整数也可以隐式转换为枚举类型(只要整数值在枚举值的范围内),这可能导致意外的类型转换和难以追踪的错误。

总结

这篇关于C++基础整理(9)之强枚举类,enum class的意义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/918254

相关文章

Spring Boot 常用注解整理(最全收藏版)

《SpringBoot常用注解整理(最全收藏版)》本文系统整理了常用的Spring/SpringBoot注解,按照功能分类进行介绍,每个注解都会涵盖其含义、提供来源、应用场景以及代码示例,帮助开发... 目录Spring & Spring Boot 常用注解整理一、Spring Boot 核心注解二、Spr

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文