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

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;               // 明确作用域

总结

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

相关文章:

  • 介绍如何使用RDDM(残差噪声双扩散模型)进行知识蒸馏
  • qt+opengl 播放yuv视频
  • C# Enumerable类 之 集合操作
  • 基于python的升级队列加速决策
  • 【Java项目】基于JSP的幼儿教育管理系统
  • 【从零开始学习计算机科学】编译原理(一)编译过程概述
  • Lecture1 绪论
  • java项目之基于ssm的在线学习系统(源码+文档)
  • ✨SQL-递归CTE
  • 【PyCharm】Python和PyCharm的相互关系和使用联动介绍
  • 【2025】Electron Git Desktop 实战一(上)(架构及首页设计开发)
  • 安全测试数据的分析、报告及业务应用
  • LLM预训练过程-简明版本
  • 400. 第 N 位数字
  • ajax组件是什么
  • zerotier搭建免费moon服务器
  • 2.5 Spring Boot异常处理全局化:@ControllerAdvice实战
  • 刷leetcode hot100--动态规划3.12
  • RHCE大纲
  • std::ranges::views::reverse, std::ranges::reverse_view
  • 美凯龙:董事兼总经理车建兴被立案调查并留置
  • 深圳中院回应“退休夫妻月入1.2万负债1.2亿”:其自述因经营不善负债
  • A股三大股指涨跌互现:银行股领涨,两市成交12915亿元
  • Manus向全球用户开放注册
  • 中美是否计划讨论美方以芬太尼为由对华征收的特别关税?外交部回应
  • 国产水陆两栖大飞机AG600批产首架机完成总装下线