C++ enum class枚举类

C++枚举类(enum class)详解:告别传统枚举的坑,解锁类型安全新姿势! 黄金准则:能用枚举类就不用传统枚举! 阅读详情
AI摘要

本文介绍了C++中的枚举类,包括它的定义、使用方法和优点。枚举类允许用户定义一组命名的整数常量,通过作用域规则避免命名冲突,提供更安全的类型系统。在使用中需要注意枚举类成员的初始化和赋值必须通过枚举类自身,且不能直接转换为整数类型,但可以通过显式类型转换。

目录

一、定义

二、使用

1、用法

2、优点

三、注意事项

1、初始化和赋值

2、类型转换


一、定义

枚举类型:是用户定义的若干枚举常量的集合,属于用户自定义的数据类型。

C++枚举包含两种:限定作用域枚举类型和不限定作用域枚举类型。

定义限定作用域的枚举类型的一般形式是使用enum class关键字。此类型也是我们本文要讲解的主题:枚举类。

eg:

enum class open_modes{
    input,
    output,
    append
};

二、使用

1、用法

对于枚举类,访问其成员需要遵循常规的作用域准则,并且成员在枚举类的作用域外是不可以被访问的。

eg:

enum class peppers {
    red,
    yellow,
    green
};

enum class flowers{
    red,
    while,
    green
};


peppers p = green; //错误,没使用枚举类的作用域访问,无法直接访问枚举类的成员。
peppers p2 = peppers::red; //正确,遵循作用域准则,可以访问作用域内的成员。
flowers f = flowers::red; //正确,遵循作用域准则,可以访问作用域内的成员。

2、优点

枚举类解决同个作用域内,枚举类型的成员不能重名的问题。

对于代码规模较大的软件工程,按照模块分配给不同开发人员开发,不同开发人员可能定义多个枚举类型,不同模块集成到一个工程可能出现同名的枚举成员,按照不限定作用域枚举类型定义会导致编译失败,从而增加代码集成工作量。如果改用枚举类进行定义,只有枚举类不相同,并使用作用域的方式进行访问,不同枚举类即使重定义枚举成员也没影响。

三、注意事项

1、初始化和赋值

枚举类变量必须使用枚举类成员进行初始化或赋值,不能使用整数常量直接初始化或赋值。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

enum class Color {
    Red,
    Blue,
    Black
};


int main(void)
{
    Color color1 = Color::Blue; //正确
//    Color color2 = 2; //错误,类型不匹配。编译报错
    Color color3 = static_cast<Color>(10); //正确,但没意义。将整数进行强制类型转换,虽然语法没报错,但是值范围超出了枚举类成员值,没啥意义。

    return 0;
}

2、类型转换

C++编译器不会将枚举类变量默认转换为整数类型,但是我们可以使用强制类型转换将枚举类型变量显式地转换为整数类型。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

enum class Color {
    Red,
    Blue,
    Black
};


int main(void)
{
    Color color1 = Color::Blue;
//    unsigned int color_val1 = color1; //错误,枚举类变量无法直接隐式转换为整数。编译报错
    unsigned int color_val2 = static_cast<unsigned int>(color1); //正确,使用C++强制类型进行显示转换
    cout<<"color_val2: "<<color_val2<<endl;

    return 0;
}

 参考文献:

《C++ Primer中文版》

c++17(2)-枚举类enum class enum class Enumeration{ Val1, Val2, Val3 = 100, Val4 /* = 101 */,}; 此种枚举为类型安全的。枚举类型不能隐式地转换为整数;也无法与整数数值做比较。 #include <iostream> using namespace std ; int main(int argc, char **argv) { enum... 阅读详情

相关推荐

C++ 打印enum class枚举类

C++11 中引入了强类型的enum class类型(或称为枚举类),但是有一点比较尴尬的是,std::cout标准流不支持输出enum class类型。E0349 没有与这些操作数匹配的 "

L-Super的博客 4003

C++11枚举类——enum class

文章目录枚举类优势——降低命名空间污染枚举类优势——避免发生隐式转换枚举类优势——可以前置声明C++98中enum的使用情况 enum现在被称为不限范围的枚举型别 enum class是限定作用域枚举型别,他们仅在枚举型别内可见,且只能通过强制转换转换为其他型别。 两种枚举都支持底层型别指定,enum class默认是int,enum没有默认底层型别 enum可以前置声明,enum仅在指定默认底层型别的情况下才能前置声明   众所周知在C++中,变量名字仅仅在一个作用域内生效,出了大括号作用域,

千祠的博客 6万+

C++惯用法之enum class

,其中EnumName表示枚举类型的名称,UnderlyingType表示底层类型,可以是整数类型或者枚举类本身。这样可以避免传递错误的参数导致的错误,提高代码的可靠性。enum class是C++中定义枚举类型的一种惯用法,它提供了更强的类型安全性和作用域限制。其中,EnumName表示枚举类型的名称,UnderlyingType表示底层类型,可以是整数类型(如int、unsigned int等)或者枚举类本身。在使用enum class时,编译器会进行类型检查,确保传递的参数是正确的枚举类型。

SVIPCODE的博客 1211

【C++】C++11枚举类型enum class

文章目录0x00 前言0x01 枚举类型定义0x02 限定作用域enum class使用1.限定作用域enum class定义2.举例0x03 enum class与enum区别1.避免枚举成员重定义2.避免隐式转换3.声明前置0x04 总结 0x00 前言 文章中的文字可能存在语法错误以及标点错误,请谅解; 如果在文章中发现代码错误或其它问题请告知,感谢! 0x01 枚举类型定义 若一个变量只有有限的几种可能,我们可以定义枚举(enumeration)类型,比如一个星期中取值范围只能是星期一至星期日,性别

C/C++攻城狮 6730

enum class的使用

枚举类型是全局的,它的枚举常量会被直接放入全局作用域。枚举值会被转换为整数,容易造成类型混乱。中,枚举常量会被引入到全局作用域,这可能会导致命名冲突。,但你可以显式指定底层类型,使得枚举类型更具灵活性。值与整数或其他枚举类型混合使用,这样会导致潜在的错误。是现代 C++ 编程中推荐使用的枚举类型,它比传统的。时,你可以指定枚举的底层类型,从而控制其存储类型。时,枚举值不会与其他枚举或变量产生冲突。类型内部的,它不再与其他类型自动转换。中,枚举值是作用域限定的,必须使用。中的作用域污染和类型不安全的问题。

m0_49476241的博客 1291

ArduPilot代码解析之四 — 姿态和位置控制

ArduPilot采用级联控制架构实现飞行器的姿态和位置管理。该系统通过位置→速度→加速度→姿态→角速率→电机指令的逐级转换,将高级指令转化为底层执行信号。位置控制采用三维独立控制,水平轴与垂直轴分别处理;姿态控制通过角度误差→角速率→电机输出的两层级联实现。系统支持多种输入模式,并内置运动学整形功能确保轨迹平滑。不同飞行器类型(多旋翼、直升机、潜艇等)有专门的调参方案,通过调整PID参数、加速度限制等实现最优控制性能。该架构兼顾控制精度与飞行稳定性,适用于各类自主飞行场景。

rainercool的专栏 823

C++枚举类型enum与enum class

文章目录一.关于枚举类型二.枚举类型enum的使用三.枚举类型enum class的使用 一.关于枚举类型 1. 什么是枚举类型? 答:如果一个变量只有几种可能的值,那么就可以定义为枚举类型,比如:性别只有男和女,那么就可以将性别定义为一种枚举类型,其中男和女就是性别所包含的变量。所谓”枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。在C++中,枚举类型分为不限定作用域(enum)和限定作用域(enum class)。 2. enum与enum class的区别? (为什么需要

冬瓜的博客 1万+

Linux密码破解(使用hydra工具和使用john暴力破解)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、使用hydra离线破解linux密码1.准备实验环境2.创建用户名字典3.hydra密码爆破二、复制shadow文件,使用john暴力破解1.实验环境1.复制linux的shadow文件2.john暴力破解 一、使用hydra离线破解linux密码 1.准备实验环境 ①攻击机:kali_linux 2021.2(ifconfig查询IP地址:192.168.119.132) ②靶机:Ubantu 16.04(ifconfig

weixin_46447549的博客 2万+

C++枚举类型enum与enum class的使用

C++枚举类型enum与enum class的使用

奋斗的菜鸟博客 3086

通达信抓波段指标(主图)

VAR3:=IF(INBLOCK('科创板'),VART20,IF(INBLOCK('创业板') AND DATE>1200823,VART20,IF(INBLOCK('ST板块'),VART5,VART10)));VAR5:=IF(INBLOCK('科创板'),CT20,IF(INBLOCK('创业板') AND DATE>1200823,CT20,IF(INBLOCK('ST板块'),CT5,CT10)));曾涨停/紫色细K线:青字"炸",涨停未封住。曾跌停/蓝色细K线:红字"撬",跌停被打开。

q125500612的博客 2127

手把手教你用Gazebo+ROS搭建智能小车机械臂系统(含完整配置文件)

本文提供了一份详细的实践指南,手把手教你使用Gazebo和ROS搭建智能小车机械臂仿真系统。内容涵盖从URDF/Xacro模型设计、Gazebo控制器配置到ROS话题通信与系统集成的完整流程,并提供了可复用的配置文件与调试技巧,帮助开发者快速构建并控制一个功能完备的移动操作机器人平台。

sugar的博客 971

C++ 语言枚举类 (enum class)

C++ 语言枚举类 (enum class) 1. enum class //============================================================================ // Name : Yongqiang Cheng // Author : Yongqiang Cheng // Version : Version 1.0.0 // Copyright : Copyright (c) 2020 Yongqia

程永强 2594

对称加密中GCM和CBC俩种加密模式的区别

**CBC(Cipher Block Chaining)** 和 **GCM(Galois/Counter Mode)** 是两种常见的对称加密模式。它们的主要区别体现在加密方式、性能和安全性上。

闲人 1107

c枚举类型enum例题_C++枚举类型enum与enum class的使用

一.关于枚举类型1. 什么是枚举类型?答:如果一个变量只有几种可能的值,那么就可以定义为枚举类型,比如:性别只有男和女,那么就可以将性别定义为一种枚举类型,其中男和女就是性别所包含的变量。所谓”枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。在C++中,枚举类型分为不限定作用域(enum)和限定作用域(enum class)。2. enum与enum class的区别? (为...

weixin_39975744的博客 898

新手小白如何学习编程

学习目标推荐第一门语言优势网站 / APP 开发(前端)JavaScript浏览器原生支持,能快速做出可视化效果后端 / 服务器 / 数据分析Python语法简洁像英语,库多、应用广(入门友好)游戏开发先用电竞入门,再转专业引擎硬件 / 嵌入式(比如单片机)C 语言贴近硬件,行业标准办公自动化(Excel / 文档处理)Python快速解决重复工作(比如批量改文件)👉新手首选推荐。

2501_94331842的博客 2230

人工智能之数学基础:弄懂数学本质,让我们不再害怕数学

数学的用途远远超过了人们的想象,甚至无处不在,任何领域都需要用到数学知识,人工智能也不例外。我将尽可能地将数学知识和机器学习算法相结合,让大家知道这些数学知识咋人工智能领域中的应用,使得数学的学习不会过于枯燥,同时也帮助大家扫清在学习算法过程中的数学障碍。除此之外,我还希望帮助大家建立一种不一样的数学思维,不再将数学看成是符号的演算、公式的推导,而是将数学看成是一种描述这个世界的工具,这样你就会发现这个世界处处有数学。当我们面对问题的时候,你是否会对问题进行抽象,然后通过数学来解决问题?

huanfeng_AI的博客 627

不要enum class,更不要enum,自定义C++的枚举类

我们知道C++的enum为兼容C,也继承了其缺点,其成员为全局作用域。 比如下面的例子,编译的时候Count就被认为重复定义了: enum type1 {Bone, Fat, Muscle, Count}; enum type2 {Avg, Med, Var, Count}; 然后我们知道C++11出来个enum class,改善了上述问题,并使枚举变成强数据类型。 在一般情况,这种做法都是很不错的。但有时候我们还是希望enum变量可以int类型互转。尤其是程序会反复调用时,我们不希望引入独立的函

cyberobot的博客 2568

全新YOLO26有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

🔥《2026年YOLO26改进专栏》🔥 🚀持续更新500+最前沿创新改进点(顶会顶刊论文/独家创新策略),涵盖主干网络、各种卷积、注意力机制、检测头等模块,助力科研论文发表与模型性能提升,支持检测/分割/分类任务。订阅即获完整可运行项目,提供专业QQ答疑群,适合科研发论文(SCI/CCF/核心)及工业应用(PCB/医学/遥感检测)。专栏价格将逐步上涨,早订更优惠! ⭐特色:非计算机专业友好、模块可自由组合、全网独家创新;📌适用:研究生大论文和小论文创新、小目标检测、多领域科研应用,满足不同研究需求。

Ai缝合怪、助力小伙伴高效发论文 5097

C++11:强类型枚举(enum)枚举类——enum class

(705条消息) C++11枚举类——enum class_Damon_liufb的博客-优快云博客(705条消息) C++11:强类型枚举(enum)_hustyangju的博客-优快云博客

sun007700的专栏 231

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++ 2.编程风格-枚举类替换命名空间 enum class

使用enum关键字定义枚举类型,可以指定底层的整数类型(如int、unsigned int等),如果不指定,默认为`int。

wesigj的博客 1190

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++11特性:enum class(强枚举类型)详解

C++11引入的enum class(强枚举类型)解决了传统枚举的多个问题:1) 防止枚举值泄漏到外部作用域;2) 禁止不同枚举间的隐式转换;3) 允许指定底层数据类型优化内存;4) 避免命名空间污染。其基本语法为enum class Name{...},使用时需通过Name::value访问。通过指定底层类型(如uint8_t)可实现内存优化、跨平台兼容等需求。常见应用场景包括状态机实现(如网络连接状态)和配置选项(如日志级别)。相比传统枚举,enum class提供了更好的类型安全性和代码组织能力。

聚焦C++/Python编程语言、大模型应用开发 1745

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++ 枚举类(enum class)

强类型安全,防止隐式转换避免命名空间污染可以指定底层类型支持前向声明更好的代码组织和可读性状态机实现错误代码定义配置选项标志位组合任何需要类型安全的离散值集合新代码中优先使用enum class只有需要与 C 代码交互或需要隐式转换为整数时才使用传统enum枚举类是现代 C++ 中重要的类型安全特性,应该在新项目中优先使用。

LXdian_LX的博客 503

C/C++ enum class枚举类型

声明枚举类型的方式有2种: 1. 常见的enum方式 enum A { a0 = 0, a1 = 1 }; enum B { b0 = 0, b1 = 1 }; 2. enum class 方式 enum class CC { cc0 = 0, cc1 = 1 }; enum和enum class的区别如下: 1. 使用方式 enum声明的枚举可以直接使用枚举

while(1) { smile(); } 8万+

C++新特性——枚举类(enum class),以及与传统枚举的区别

enum class 是 C++11 引入的一种枚举类型,称为“强类型枚举”或“枚举类”。与传统的 enum 相比,enum class 具有更严格的类型检查,并且避免了命名冲突。

Mitos的博客 1144
上一篇: 嵌入式OTA升级实现原理
下一篇: C++无名命名空间
bulebin
博客等级 码龄10年 152粉丝 36原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值