C++ enum与enum class对比

news/2025/3/14 20:36:19/

enum 与 enum class

枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性 。在C++中,有两种主要的枚举类型:常规枚举(enum)和枚举类(enum class)。这两种枚举类型在使用方式和行为上有一些重要的差异,本文将详细讨论这两种枚举的区别和用法。

作用域不同

  • enum

枚举值的名称在相同作用域下是可见的,可能会导致命名冲突。

enum Color {red,green,blue
};int red = 1;  // C2365: “red”: 重定义;以前的定义是“枚举数”
  • enum class

枚举值的名称在枚举类的作用域内是局部的,不会与其他作用域中的名称冲突。

enum class ClassColor {red,green,blue
};int red = 1;  // 正确

不同级别的类型安全

  • enum
if (red == 2) {// TODO
}

编译器提供比较弱的类型安全,上面示例是可以正常运行。

  • enum class
if (ClassColor::red == 2) {// TODO
}

由于 enum class 禁止隐式转换,所以报错:error: C2676: 二进制“==”:“ColorClass”不定义该运算符或到预定义运算符可接收的类型的转换。

但我们可以进行显示的类型转换,如下所示:

if (static_cast<int>(ColorClass::red) == 2) {// TODO
}

这样就 OK 啦!

是否可以前置声明

两个我都测试了都可以前置声明,不知道别人是怎么测试的,和编译器有没有关系!

默认底层数据类型不同

两个我都测试了是int,不知道别人是怎么测试的,和编译器有没有关系!

总结(建议使用 enum class)

  • 常规枚举适合于在相对简单的情况下使用,但容易导致命名冲突和类型混淆。
  • 枚举类更加类型安全,适合于需要更好的命名空间隔离和类型约束的情况。它们在多个枚举类型共存时有更好的表现。
  • 常规枚举的值可以随意进行强制类型转换,而枚举类要求使用限定符。

http://www.ppmy.cn/news/1199913.html

相关文章

排列与置换换+容斥+多项式生成函数启发式合并:[Gym-103446B]

https://vjudge.net/contest/591700#problem/G 看到排列&#xff0c;先考虑置换换&#xff0c;题意转化为置换环相邻的不能再最终序列上相邻 而这个过程看起来很容斥&#xff0c;所以我们容斥&#xff1a;至少要 x x x 个相邻 我们发现每个置换环的所有边不能全部同时被选&…

<微信小程序>《微信小程序开发笔记》(二)

《微信小程序开发笔记》&#xff08;二&#xff09; 1 程序开发1.1 原则&#xff08;自己感悟&#xff09;1.2 架构1.3 开发模式 2 建立项目3 微信代码构成3.1 JSON 配置文件3.2 WXML 模板文件3.3 WXSS 样式文件3.4 JS 脚本逻辑文件 1 程序开发 1.1 原则&#xff08;自己感悟&…

线代学习笔记-向量

numpy广播机制&#xff0c;自动增加维数 numpy中的array函数生成向量&#xff0c;&#xff08;&#xff09;是函数标配&#xff0c;&#xff08;&#xff09;下必有一个[]表示向量元素集合&#xff0c;第一层[]下的后每一个[]代表一行&#xff0c;没有这个[]&#xff0c;表示这…

维乐 Prevail Glide带你做破风王者,无阻前行!

对于自行车骑手来说&#xff0c;需要应对的问题有很多&#xff0c;其中最大的问题之一&#xff0c;就是「风阻」。风阻永远都是你越反抗越强&#xff0c;因此为了克服风阻的力量&#xff0c;时间久了&#xff0c;身体自然会造成一定程度的损伤。如何才能调整前行的步伐&#xf…

计算机网络第4章-IPv4

IPv4数据报格式 IPv4数据报格式如下图所示 其中&#xff0c;有如下的关键字段需要特别注意&#xff1a; 版本&#xff08;号&#xff09;&#xff1a; 版本字段共4比特&#xff0c;规定了数据报的IP协议版本。通过查看版本号吗&#xff0c;路由器能确定如何解释IP数据报的剩…

VMware安装CentOS最小化开发环境导引

目录 一、概要 二、介绍 三、下载 四、安装 4.1 创建虚拟机 4.2 安装CentOS 五、配置网卡 六、配置本地安装源 七、安装软件 7.1 gcc/g 7.2 C的atomic库 7.3 java 7.4 Cmake 7.5 MariaDB客户端&#xff08;兼容mysql&#xff09; 八、用户配置文件.bash_profile…

监控易:支持多种协议和设备,适应复杂多变的IT环境

在当今的数字化时代&#xff0c;IT环境越来越复杂多变&#xff0c;各种设备、系统、应用程序需要实时地进行监控和管理&#xff0c;以保证业务的正常运行和高效性能。然而&#xff0c;传统的监控方案往往无法满足这些需求&#xff0c;因为它们通常只支持有限的协议和设备类型&a…

AtCoder Beginner Contest 327 G. Many Good Tuple Problems(带标号二分图计数+有区别小球放入有区别盒子)

题目 一个长为n(n<30)的原始序列x&#xff0c;x[i]可以取值0或1 一个长为m(m<1e9)的点对序列(s,t)&#xff0c; s序列第i项和t的第i项&#xff0c;均可以取值[1,n]&#xff0c; 如果构造好s和t后&#xff0c;对任意都存在01序列x使得&#xff0c; 则称这个序列是合法…