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 IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C