当前位置: 首页 > article >正文

c++ enum使用笔记

c++ enum使用笔记

      • 1. 无作用域枚举 vs. 有作用域枚举
      • 2. 枚举项的初始化规则
      • 3. 指定底层类型
      • 4. 类型转换规则
      • 5. 枚举的声明与定义
      • 6. 示例对比
        • 无作用域枚举的潜在问题:
        • 有作用域枚举的安全性:
      • 总结

C++中的枚举( enum)是一种取值受限的特殊类型,分为 无作用域枚举有作用域枚举(C++11起)。以下是详细解释及示例:


1. 无作用域枚举 vs. 有作用域枚举

  • 无作用域枚举(传统枚举):
    枚举项直接暴露在外部作用域,可能导致命名冲突。

    enum Color { Red, Green, Blue };  // 定义
    Color c = Red;                     // 直接访问枚举项
    
  • 有作用域枚举(C++11起,enum classenum struct):
    枚举项需通过枚举类型名访问,避免命名冲突。

    enum class Color { Red, Green, Blue };  // 定义
    Color c = Color::Red;                   // 必须通过作用域访问
    

2. 枚举项的初始化规则

  • 默认从0开始递增
    enum { A, B, C };  // A=0, B=1, C=2
    
  • 可手动指定值,后续项自动递增:
    enum HttpCode { OK=200, Created=201, Accepted=202, BadRequest=400 };
    enum { X=5, Y, Z };  // X=5, Y=6, Z=7
    

3. 指定底层类型

  • 控制枚举项的尺寸,默认类型为int(无作用域枚举)或可指定(有作用域枚举):
    enum Direction : char { Up, Down };       // 无作用域,底层类型为char
    enum class Packet : uint8_t { SYN, ACK };  // 有作用域,底层类型为uint8_t
    

4. 类型转换规则

  • 无作用域枚举
    可隐式转换为整型,但整型需显式转换回枚举:

    Color c = Green;
    int i = c;                          // 隐式转换,i=1
    c = static_cast<Color>(2);          // 显式转换,c=Blue
    
  • 有作用域枚举
    必须显式转换与整型互转:

    Color c = Color::Green;
    int i = static_cast<int>(c);        // 显式转换,i=1
    c = static_cast<Color>(2);          // 显式转换,c=Color::Blue
    

5. 枚举的声明与定义

  • 前向声明需指定底层类型(C++11起):
    // 头文件中声明
    enum class LogLevel : int;
    enum Direction : char;
    
    // 源文件中定义
    enum class LogLevel : int { Debug, Info, Warning, Error };
    enum Direction : char { Up, Down };
    

6. 示例对比

无作用域枚举的潜在问题:
enum Light { Red, Green };
enum Signal { Red, Yellow };  // 错误!Red重复定义
有作用域枚举的安全性:
enum class Light { Red, Green };
enum class Signal { Red, Yellow };  // 正确,作用域隔离
Light l = Light::Red;               // 明确作用域

总结

  • 无作用域枚举:简单但易命名冲突,隐式转整型。
  • 有作用域枚举(推荐):类型安全,避免污染作用域,需显式转换。
  • 底层类型:控制枚举项的存储大小,支持前向声明。
  • 初始化:灵活指定值,适用于位掩码或特定编码场景。

http://www.kler.cn/a/582547.html

相关文章:

  • RocketMQ 集群架构与部署实践(一)
  • Flutter_学习记录_device_info_plus 插件获取设备信息
  • Java糊涂包(Hutool)的安装教程并进行网络爬虫
  • FreeBSD下安装npm Node.js的22版本 并简单测试js服务器
  • 【Golang】第三弹----运算符
  • Python多版本环境管理UV
  • Linux上位机开发实战(qt编译之谜)
  • Spring 框架面试题集:常见问题解析
  • mysql安装与使用
  • 2024年广州市智能网联汽车创新实践年度报告
  • 文件上传漏洞 upload-labs靶场
  • upload-labs-靶场(1-19关)通关攻略
  • 一次解决Andriod Studio Build Gradle很慢或报错下载失败等问题
  • 蓝桥杯第二天:2023省赛C 1题 分糖果
  • 数字电子技术基础(二十七)——输入端电阻的负载特性
  • 微商模式的演进与开源链动2+1模式、AI智能名片及S2B2C商城小程序源码的应用探索
  • 游戏开发商 Nimblebites 携 Super-B 在 Sui 上推动游戏创新
  • 蓝桥杯备考:数据结构堆之序列合并
  • 【Pandas】pandas Series shift
  • 浅谈React的Diff算法,简单易懂!