C++11 强枚举类型

【C++11保姆级教程】强类型枚举(强类型枚举)和constexpr C++语言在不断地发展和演进,每个新的标准版本都会引入一些新的语言特性和改进。C++11是一个重要的里程碑,它为编程带来了许多有用且强大的特性。本篇教程将着重介绍C++11引入的两个特性:强类型枚举和constexpr。C++11引入了强类型枚举和constexpr两个特性,它们在提升代码可读性、类型安全性和编程灵活性方面发挥了重要的作用。强类型枚举通过名称限定和类型检查,避免了隐式转换和混淆,使枚举更易于使用和理解。 阅读详情

枚举就是定义一个类别,并且穷举统一类别下的个体以供代码使用。

C++98 枚举存在的缺陷:

  • 无论是具名枚举的名字还是枚举类型中的成员,都是全局范围的,其作用域是全局的。 如果在不同的枚举中定义了相同的枚举成员,则会出现**重复声明(redeclaration)**错误。

    enum PUBLIC_COLOR { RED, YELLOW, GREEN };
    enum PRIVATE_COLOR { RED, BLACK, PURPLE };      // RED 重定义
    enum PUBLIC_COLOR { WHITE, GRAY };				// PUBLIC_COLOR 重定义
    
    int main() {
        int color = RED;
    
        cout << color << endl;
    }
    

    你可能会想到使用命名空间来封装枚举类型,但是如果其中的某个命名空间漏写了名字则会变成匿名空间,而匿名空间中的所有枚举成员会默认变成全局命名空间下的成员。因此这种方法是不合适的。

  • 枚举中的成员被设计为常量数字的别名,因此可以隐式的转换为 int 类型,但是这在某些时候是不被期望出现的。

  • 枚举类型锁占用的空间大小以及符号不确定。

C++11 中的强枚举类型语法格式

enum class enum_name: elem_type { elem1, elem2, ... };

C++11 强枚举类型的优点

  • 强作用域,强类型枚举成员的名称不会被输出到其父作用域空间。

    enum class PUBLIC_COLOR { RED, GREEN, BLACK };  // ok
    enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };   // ok
    
  • 转换限制,强类型枚举成员的值不可以与整形隐式地相互转换。

    enum class PUBLIC_COLOR { RED, GREEN, BLACK };
    enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };
    
    if (PUBLIC_COLOR::GREEN == 1) {     // errror: 未定义可接受的类型转换
        cout << "color1 == 1" << endl;
    }
    
    if (PRIVATE_COLOR::PURPLE == 1) {   // ok
        cout << "color2 == 1" << endl;
    }
    
  • 可以指定底层类型。强类型枚举默认的底层类型为 int,但也可以显式地指定底层类型。

    enum class PUBLIC_COLOR: char { RED, GREEN, BLACK };
    enum PRIVATE_COLOR: int { RED, PURPLE, PINK };
    
    cout << sizeof(PUBLIC_COLOR::GREEN) << endl;		// 1
    cout << sizeof(PRIVATE_COLOR::PURPLE) << endl;		// 4
    
  • 不可能对不同的枚举类型的枚举值进行比较。但相同枚举值之间如果指定的值相同,那么可以进行比较。

    enum class PUBLIC_COLOR { RED, GREEN, BLACK };
    enum PRIVATE_COLOR { RED, PURPLE, PINK = 1 };
    
    if (PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE) {     // errror
        cout << "PUBLIC_COLOR::GREEN == PRIVATE_COLOR::PURPLE" << endl;
    }
    
    if (PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK) {     // ok
        cout << "PRIVATE_COLOR::PURPLE == PRIVATE_COLOR::PINK" << endl;
    }
    
  • 如果想要输出枚举值可以进行强制类型转换

    enum class PUBLIC_COLOR: char { RED, GREEN, BLACK };
    enum PRIVATE_COLOR: int { RED, PURPLE, PINK };
    
    cout << static_cast<int>(PUBLIC_COLOR::RED) << endl;		// 0
    cout << static_cast<int>(PRIVATE_COLOR::PURPLE) << endl;	// 1
    
C++11之强枚举类型 目录 1. 枚举定义回顾 2. c++98中枚举存在缺陷 缺陷(1) 缺陷(2) 3. c++11强enum类型 3.1 强类型的枚举优点 4 . c++11对enum类型进行了扩展 5 . c++11中匿名的强类型枚举 1. 枚举定义回顾 枚举类型是c/c++中的一个基本内置类型,从枚举的本意来说:就是定义一个类别,并且穷举同一类别下的个体以供代码中去使用... 阅读详情

相关推荐

牛耕式全覆盖算法-matlab代码

牛耕式路径全覆盖算法,也称为牛耕算法或者蚂蚁算法,是一种用于解决路径规划问题的启发式算法。这个算法的灵感来自于牛在耕田时的行为。在这个算法中,假设有一块田地需要耕作,牛从田地的某个角落开始行走,走过的路径会被标记。牛会优先选择尚未经过的路径,当所有的路径都走过后,算法停止。在路径规划问题中,田地可以看作是一个由节点和边构成的图。每个节点代表一个位置,每条边代表两个节点之间的连接。路径全覆盖问题是找出一组路径,使得每个节点都被至少一条路径经过。牛耕式路径全覆盖算法的基本思想是以启发式的方式逐步构建路径。

m0_69611489的博客 1690

c++ 强类型枚举

作者: 苏丙榅链接: https://subingwen.cn/cpp/enum/

@bangbang的博客 1063

嵌入式开发面试题全解析:指针、内存、数据类型关键问题总结

本文对嵌入式开发典型面试题进行深度解析,涵盖多方面关键知识。题目 19 揭示字符指针修改字符串常量的错误操作;题目 20 展现strcpy引发的缓冲区溢出风险;题目 21 体现未初始化数组与strlen结合的不可预测性;题目 22 通过位域与对齐规则计算结构体大小;题目 23 因unsigned char溢出导致循环异常。这些题目全面覆盖指针操作、内存管理、数据类型特性等核心内容,精准指出开发中易疏忽的陷阱,有助于理解编程规范,规避风险,提升代码质量与稳定性,是深入掌握嵌入式开发要点的实用指南。

嵌入式中手 1364

C++ 语言特性13 - 强枚举类型

枚举值可以隐式转换为整数,也可以从整数隐式转换为枚举类型,这可能导致类型安全问题。枚举类成员不能隐式转换为整数或其他类型,必须使用显式类型转换。:C语言中的枚举成员是公开的,这意味着它们在枚举类型定义的作用域内是可见的,并且可以不加区分地访问。:强枚举的成员被限定在枚举类型的作用域内,必须使用枚举类型名称和作用域解析运算符(:枚举类型可以与整数进行赋值和比较操作,枚举值之间也可以直接比较。:枚举值可以隐式转换为整数,整数也可以隐式转换为枚举类型。:强枚举类型与整数之间的转换需要显式进行,不能隐式转换。

GPU全栈博主 959

AGX Orin设计-外围电路设计之一

AGX ORIN是英伟达Jetson系列中算力规格最高端的模组,其高达200TOPS/275TOPS的算力可以为各类场景提供澎湃的算力支持,本篇文章针对AGX ORIN的常规外围电路设计做分析描述。

zhiyuchenkeji的博客 4483

HBuilderX远程开发环境配置:Windows SSH连接实操

详细介绍如何在Windows系统中通过SSH连接远程服务器,配置HBuilderX进行高效远程开发,提升编码协作效率。全程实操演示,轻松掌握hbuilderx与远程环境的无缝对接。

weixin_35751194的博客 1192

C++枚举类(强类型枚举、强枚举)(枚举类与switch语句)

枚举类型(Enumerations)在C++中是一种用户定义的类型,它允许开发者为程序定义一个变量,这个变量限定在一组预定义的值之中。从C++11开始,C++引入了一种新的枚举类型,称为“枚举类”(或“强类型枚举”),它提供了更强的类型安全和更好的命名空间隔离。在使用现代C++进行项目开发时,适当使用枚举类不仅可以提高代码质量,还可以促进团队内部代码风格的一致性,降低维护成本。通过在枚举类的声明中指定类型,可以定义枚举值存储的底层类型。可以明确指定枚举类的底层类型,控制枚举类型的大小和性能。

Dontla的博客 1772

Python从0到100(二):Python语言介绍及第一个Pyhon程序

Python从0到100(二):Python语言介绍及第一个Pyhon程序。与C和Java比,Python的学习成本和难度曲线不是低一点,更适合新手入门,自底向上的技术攀爬路线。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 5440

枚举类--强枚举

c++11增加了枚举类和枚举结构体。 旧的c++枚举类型有一个坏处是,他们将枚举成员引入周围的命名空间,导致了名称冲突 enum eSecondCount { eSecond = 1, }; int eSecond = 3;//与枚举声明在同一个作用域 此外,旧的C++ enum会隐式转换为int,当我们不预期或不需要这样的转换时会导致难以察觉的错误 enum eSecondCou...

a1007885391的博客 463

基于STM32L4XX、HAL库的DP83822 以太网收发器(PHY)驱动程序设计

一、简介:DP83822是德州仪器(TI)推出的一款低功耗、高性能10/100Mbps以太网物理层收发器(PHY)。它具有以下主要特性:支持10BASE-T和100BASE-TX以太网标准低功耗设计,适合嵌入式应用MII/RMII接口,方便与微控制器连接内置自检和诊断功能支持自动协商和手动配置工业级温度范围(-40°C至+85°C)

zhusl6688的博客 528

搭建一个简单的 Django + Vue 项目

在本文中,我将为您详细介绍如何搭建一个简单的 Django + Vue 项目。Django 是一个使用 Python 编写的高级 Web 框架,而 Vue 是一个流行的 JavaScript 框架,用于构建用户界面。通过结合 Django 和 Vue,我们可以创建强大的全栈 Web 应用程序。创建 Django 项目设置 Django 后端创建 Vue 前端连接 Django 和 Vue让我们开始吧!

JfpBlockchain的博客 352

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

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

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++11强枚举类型

下面主要代码 强枚举类型就是给我们的枚举类型限制相关的类型。#include <iostream> using namespace std;//这里我们可以给enum限定类型 //这里表示我们只能使用char类型 enum color:char{red='A',yellow,green,white}; enum SS{SS1=0,SS2='A',SS3='C'}; int main() {

TestMin的博客 747

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

C语言枚举和C++枚举的区别?enum class(C++11强类型枚举(Strongly-typed enums)强枚举 Scoped Enumerations)(C++98弱枚举类型)

C 枚举类型支持不同类型枚举值之间赋值、以及数字赋值、比较,并且具有外层作用域。C++ 中枚举不允许不同类型的值给枚举类型变量赋值,但仍然支持不同类型之间枚举进行比较,枚举符号常量具有外层作用域。C++ 强枚举类型不允许不同类型之间的赋值、比较,枚举常量值并不具有外层作用域。

Dontla的博客 2244

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

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

C++11:强枚举类型enum

转自https://blog.youkuaiyun.com/caychen/article/details/79681806。感谢博主辛苦整理,侵删。 #include <iostream> namespace T //命名空间T { enum Color{ Black, Gray, Green }; } namespace S { enum Size{ Small =...

又帅又酷的红头发10号 373

卷积的三大运算律,在图像滤波和CNN里到底怎么用?一个例子讲明白

本文深入解析卷积的三大运算律(交换律、结合律、分配律)在图像滤波和CNN中的实际应用。通过OpenCV和PyTorch代码示例,展示如何利用这些数学性质优化图像处理流程、简化CNN结构设计,显著提升计算效率和模型性能。

weixin_33735077的博客 370

C++ 强枚举类型

为了解决c/c++中的enum类型的一系列缺点,比如:非强类型,允许隐式转换为int型,占用存储空间及符号性不确定。c++11引入了枚举类(又称为:强枚举类型strong-typed enum) 语法格式: enum class 类型名 {枚举值表}; 如:enum class People{yellow,black,white}; //这样就成功的定义了一个强类型的枚举People。 注意...

arno的博客 1598

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

可以显示指定其底层存储类型,默认为int。(为其他的比如char的话 有什么作用和意义我不太清楚),通常默认为int。这可能导致不同编译器和平台之间的兼容性问题,因为int的大小可能会有所不同。C++11 推出的 强类型枚举(enum class)可以隐式转换为整数。不同枚举类型的值混淆。给每个枚举添加命名空间可以解决,但属实非常麻烦。没有底层类型: 传统的C风格枚举没有。的主要优势在于提供了更好的。,这可能导致潜在的命名冲突。

记录值得记录的东西 1240

C++11 扩展 - 强枚举类型,静态断言,tuple

摘要:C++11引入的强类型枚举(enum class)解决了传统枚举的隐式转换、作用域污染和底层类型限制问题。static_assert提供了编译时断言机制,增强代码健壮性。std::tuple作为异构值集合,通过变参模板和递归继承实现,支持索引访问和解包。与Python元组相比,C++的tuple具有静态类型、可修改元素等特点,其底层实现依赖变参模板、递归结构和索引序列,所有操作均在编译期完成,保证运行效率。这些特性共同提升了C++的类型安全性和元编程能力。

Small_entreprene的博客 1024

C++11特性(9):强枚举类型enum

#include &lt;iostream&gt; namespace T //命名空间T { enum Color{ Black, Gray, Green }; } namespace S { enum Size{ Small = 1, Middle, Large }; } namespace //匿名命名空间(全局) { enum Color{Black,Bl...

caychen的博客 1424

Cocos2d-x3.1中C++11强枚举类型

转载自:http://blog.youkuaiyun.com/star530/article/details/24273309 在cocos2dx 3.0的文档里有这么一句话: 以 k 开头的常量和枚举量,通常被定义为 int 或者简单的 enum 类型,现在已经被强类型枚举(enum class)所替代,这样有利于避免ChongTu和类型错误。 新的格式是: | v2.1       | v3.0

yuxikuo_1的专栏 1467

C++强枚举类型

在 C++ 中,“强枚举”(Strong Enum)通常指使用 enum class 定义的枚举类型(C++11 引入)。相比传统枚举(enum),它具有更严格的类型安全和作用域控制。Value2,// ...enum class:关键语法,声明强枚举EnumName:枚举类型名称UnderlyingType(可选):底层整数类型(如 int, unsigned char 等),默认是 intValueX:枚举值,可显式赋值或自动递增。

肩上风骋的博客 579

C++的枚举类型

C的时代 枚举类型 在代码中直接写出来的常量,我们称之为“魔数”。例如: int week = 1; 你说这个week是星期一,也有人说这个week应该是星期日。这玩意太容易引起歧义,让人摸不着头脑,如同莫名其妙的魔术,所以我们称之为“魔数”。 问题的关键是我们应该给这个常量一个确切的名字: int monday = 1; 这看起来好多了,不会引起歧义了,于是你愉快地继续写道: int monday = 1; int tuesday = 2; int wednesday = 3; ..

oowgsoo的专栏 574
上一篇: C++11 Lambda 表达式
下一篇: 配置 OpenGL(Win10 + VS2019 + GLAD + GLFW) 并创建自己的第一个 OpenGL 项目
番茄不炖牛腩
博客等级 码龄10年 20粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值