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

相关文章

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function