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

C++初学者指南第一步---6.枚举和枚举类

C++初学者指南第一步—6.枚举和枚举类

文章目录

  • C++初学者指南第一步---6.枚举和枚举类
    • 1.作用域的枚举(enum class类型)(C++11)
    • 2.无作用域的枚举(enum类型)
    • 3.枚举类的基础类型
    • 4.自定义枚举类映射
    • 5.和基础类型的互相转换

1.作用域的枚举(enum class类型)(C++11)

语法:

enum class name { enumerator1, enumerator2, … enumeratorN };

默认值:每个枚举类映射到从 0 到 N-1 的整数

enum class day { mon, tue, wed, thu, fri, sat, sun };
day d = day::mon;      
d = day::tue;  // OK
d = wed;  // Err! 编译错误: 'wed' 只能在day作用域内
  • 仅限于命名范围的枚举类
  • 无法像某些其他语言那样查询枚举的属性

2.无作用域的枚举(enum类型)

语法:

enum name { enumerator1, enumerator2, … enumeratorN };

注意缺少关键字“class”。

enum day { mon, tue, wed, thu, fri, sat, sun };
day d = mon;  // OK!, 枚举值 "mon" 没有作用域
int i = wed;  // OK!, i = 2
enum stars { sun,};  // Err! 编译错误:名称冲突
  • 不局限于作用域的枚举⇒名称冲突
  • 危险的隐式转换为基础类型
  • 无法像某些其他语言那样查询枚举的属性

注意一下enum class和enum类型的区别,enum枚举类型从C语言开始就有了,C++中也继承了这一类型,那为什么还要增加enum class呢,主要有以下几个原因:

  1. 类型安全性:
    enum class 是一种强类型枚举(strongly typed enum)。它拥有更好的类型安全性,因为它的枚举值是被限定在枚举类型内部的。
    传统的 enum 是一种弱类型枚举(weakly typed enum)。它的枚举值可以隐式地转换为整型,容易造成意外的转换和错误。
  2. 命名空间:
    enum class 的枚举值是限定在该枚举类型的命名空间中的。要访问枚举值需要使用 EnumName::ValueName 的形式。
    enum 的枚举值直接存在于全局命名空间中,可以直接使用 ValueName 的形式访问。
  3. 默认基础类型:
    enum class 的默认基础类型是 int。但可以使用 enum class EnumName : underlying_type; 的形式指定其他整数类型作为基础类型。
    enum 的默认基础类型也是 int,但不能直接指定其他基础类型。
  4. 作用域:
    enum class 的作用域仅限于该枚举类型本身。
    enum 的作用域会"污染"全局命名空间。

注意:避免使用无限定作用域的枚举

3.枚举类的基础类型

  • 必须是整数类型(char、short、long、…)
  • 默认是int型
// 7个值 ⇒ char类型应该足够了
enum class day : char {mon, tue, wed, thu, fri, sat, sun
};
// 不超过10,000 ⇒ short类型应该足够了
enum class language_ISO639 : short {abk, aar, afr, aka, amh, ara, arg,};

4.自定义枚举类映射

  • 可以显式设置枚举类值
  • 不需要以 0 开头
  • 某些值可以省略
  • 可以是部分的(只有一些具有枚举值的枚举器)

注意:如果显式设置枚举类的枚举值,请对所有枚举类的枚举执行此操作

enum class month {jan = 1, feb = 2, mar = 3, apr = 4,  may = 5,  jun = 6,  jul = 7, aug = 8, sep = 9, oct = 10, nov = 11, dec = 12 
};
enum class flag {A = 2, B = 8, C = 5, D, E, F = 25
};

5.和基础类型的互相转换

enum class month {jan = 1, feb = 2, mar = 3, apr = 4,  may = 5,  jun = 6,  jul = 7, aug = 8, sep = 9, oct = 10, nov = 11, dec = 12 
};
枚举 → 整数整数→枚举
int i = static_cast(month::mar);
// i: 3
int i = 0;
cin >> i;
// 确定 i ≥ 1 and ≤ 12 …
month m1 = static_cast(i);

附上原文链接
如果文章对您有用,请随手点个赞,谢谢 ^_^ !
不来张图片就文章标题就很丑!
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 「前端+鸿蒙」鸿蒙应用开发-常用UI组件-图片-参数
  • 如何避免vue的url中使用hash符号?
  • 2024黄河流域比赛的复现
  • vue.extend解决vue页面转构造函数暴露js供全局使用
  • shell编程中的运算符的讲解
  • 事务所管理系统的设计
  • pyrouge(ROUGE-1.5.5)的安装步骤和使用说明(适用于Linux 系统)
  • 练习题-18 计算两个积分
  • Excel文件转换为HTML文件
  • python中scrapy
  • 《UNIX环境高级编程》第三版(电子工业出版社出品)——两年磨一剑的匠心译作
  • 嵌入式中间件_3.嵌入式中间件的一般架构
  • RockChip Android12 System之Datetime
  • leetCode127. 单词接龙
  • 【记录44】【案例】echarts地图
  • 2017-09-12 前端日报
  • ES6语法详解(一)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JSDuck 与 AngularJS 融合技巧
  • node.js
  • 经典排序算法及其 Java 实现
  • 警报:线上事故之CountDownLatch的威力
  • 你不可错过的前端面试题(一)
  • 前嗅ForeSpider教程:创建模板
  • 数组大概知多少
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #includecmath
  • $$$$GB2312-80区位编码表$$$$
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Java入门)抽象类,接口,内部类
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (备份) esp32 GPIO
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (剑指Offer)面试题34:丑数
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (南京观海微电子)——COF介绍
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (五)MySQL的备份及恢复
  • (一)80c52学习之旅-起始篇
  • (转载)Linux网络编程入门
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .Net 4.0并行库实用性演练
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .Net Core与存储过程(一)
  • .NET Standard 的管理策略
  • .net 发送邮件
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET企业级应用架构设计系列之应用服务器
  • /bin/bash^M: bad interpreter: No such file ordirectory