码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++ enum与enum class对比


    enum 与 enum class

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

    作用域不同

    • enum

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

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

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

    enum class ClassColor {
        red,
        green,
        blue
    };
    
    int red = 1;  // 正确
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    不同级别的类型安全

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

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

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

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

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

    if (static_cast(ColorClass::red) == 2) {
    	// TODO
    }
    
    • 1
    • 2
    • 3

    这样就 OK 啦!

    是否可以前置声明

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

    默认底层数据类型不同

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

    总结(建议使用 enum class)

    • 常规枚举适合于在相对简单的情况下使用,但容易导致命名冲突和类型混淆。
    • 枚举类更加类型安全,适合于需要更好的命名空间隔离和类型约束的情况。它们在多个枚举类型共存时有更好的表现。
    • 常规枚举的值可以随意进行强制类型转换,而枚举类要求使用限定符。
  • 相关阅读:
    6种常见三维曲面的Three.js实现
    Java从入门到架构师_Elasticsearch
    js实现数组扁平化的多种方式
    python列表合并,去重
    用Python搭建一个猜数字小游戏
    SpringMVC-RESTful快速开发及案例:基于RESTful页面数据交互
    Java 并发编程解析 | 如何正确理解Java领域中的多线程模型,主要用来解决什么问题?
    YOLOv5代码解读[03] utils/loss.py文件解析
    C++ Primer学习笔记-----第二章:变量和基本类型
    适配器模式(Adapter Pattern)
  • 原文地址:https://blog.csdn.net/bmseven/article/details/134241293
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号