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

53 C++ 现代C++编程艺术2-枚举和枚举类

C++ 现代C++编程艺术2-枚举和枚举类.md

文章目录

  • C++ 现代C++编程艺术2-枚举和枚举类.md
    • C语言中的枚举
    • C++中的枚举
    • 枚举类的用法

C语言中的枚举

成员值只能为int类型,无法修改。
底层类型由编译器决定(通常为int),无法手动指定。

  • 成员直接暴露在全局作用域,不同枚举的成员名不可重复。
enum Color { RED, GREEN };  
enum Signal { RED };  // 错误:RED重复定义 
  • 允许隐式转换为整型,可能引发逻辑错误:
enum Color { RED, GREEN };  
int x = RED;  // 直接赋值,无类型检查 
#include <stdio.h>
enum SHAPE {CIRLE, RECT, POINT,LINE};
enum WEEK {TUS};int main()
{//用枚举初始换枚举变量enum SHAPE myshape = CIRLE;myshape = RECT;//用非枚举值或者数字,初始化枚举变量enum SHAPE msy = TUS;msy = 23;if(CIRLE == TUS){printf("相等\n");}
return 0;
}

C++中的枚举

c++里的枚举成员值类型可自由定义(如shortunsigned等),提升灵活性。

#include <iostream>
using namespace std;
enum SHAPE {CIRLE, RECT, POINT,LINE};
enum WEEK {TUS};int main()
{//用枚举初始换枚举变量SHAPE myshape = CIRLE;myshape = RECT;//用非枚举值或者数字,初始化枚举变量// enum SHAPE msy = TUS;// msy = 23;// if(CIRLE == TUS)//警告if(CIRLE == RECT){printf("相等\n");}
return 0;
}
  • C++枚举类(C++11起)
    成员限定在枚举作用域内,需通过枚举名::成员访问,避免命名冲突:

    enum class Color { RED, GREEN };  
    enum class Signal { RED };  // 合法 
    
  • 禁止隐式转换,需显式类型转换(如static_cast):

    enum class Color { RED, GREEN };  
    int x = static_cast<int>(Color::RED);  // 必须显式转换 
    
  • 支持显式指定底层类型(如charuint16_t等),优化内存与兼容性:

    enum class SmallEnum : uint8_t { A, B };  // 占1字节 
    
  • 允许前向声明(需指定底层类型):

    enum class Color : int;  // 前向声明 
    void setColor(Color c);  
    enum class Color : int { RED, GREEN };  // 后续定义 
    

枚举类的用法

枚举类是强枚举类型

#include <iostream>
using namespace std;
enum class SHAPE {CIRLE, RECT, POINT,LINE};
enum class WEEK {TUS};int main()
{//用枚举初始换枚举变量SHAPE myshape = SHAPE::CIRLE;myshape = SHAPE::RECT;//用非枚举值或者数字,初始化枚举变量// enum SHAPE msy = TUS;// msy = 23;// 错误,类型不同,不能比较if(SHAPE::CIRLE == WEEK::RECT){printf("相等\n");}
return 0;
}
http://www.xdnf.cn/news/18442.html

相关文章:

  • C++ unistd.h库文件介绍(文件与目录操作, 进程管理, 系统环境访问, 底层I/O操作, 系统休眠/执行控制)
  • Linux服务测试
  • 【链表 - LeetCode】24. 两两交换链表中的节点
  • 深入理解 Java IO 流 —— 从入门到实战
  • 排序(数据结构)
  • nanoGPT 部署
  • JUC之Fork/Join
  • EP4CE40F23I7N Altera FPGA Cyclone IV E
  • LLM实践系列:利用LLM重构数据科学流程
  • shell脚本第二阶段-----选择结构
  • 企业设备系统选型:功能适配度分析
  • Vue 插槽(Slots)全解析1
  • B树,B+树,B*树
  • 文件包含的学习笔记
  • 嵌入式Linux学习 -- 网络1
  • 深度学习——神经网络
  • canvas绘制图片等比缩放
  • Vue2+Vue3前端开发_Day6
  • Linux笔记8——shell编程基础-2
  • 网络实践——Socket编程UDP
  • 视频拼接融合技术:打造全景视界的革命性产品
  • API模型与接口弃用指南:历史、替代方案及开发者应对策略
  • `git mv` 重命名 Git 仓库中的文件夹
  • 多人编程新方式:cpolar 让 OpenHands 远程开发更轻松
  • 20250822在Ubuntu24.04.2下指定以太网卡的IP地址
  • 数据分析专栏记录之 -基础数学与统计知识 2 概率论基础与python
  • 安全帽检测算法如何提升工地安全管理效率
  • 【C++组件】Elasticsearch 安装及使用
  • Seaborn数据可视化实战:Seaborn时间序列可视化入门
  • Logstash_Input插件