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

相关文章

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++