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

news2024/12/23 5:39:26

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);

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1836236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读】-- 时间空间化:用于深度分类器训练的可扩展且可靠的时间旅行可视化

Temporality Spatialization: A Scalable and Faithful Time-Travelling Visualization for Deep Classifier Training 摘要1 引言2 动机3 问题定义4 方法论4.1 时空复合体4.2 复数约简 5 实验6 相关工作7 结论参考文献 摘要 时间旅行可视化回答了深度分类器的预测是如何在训练…

头歌资源库(11)分解2019

一、 问题描述 二、算法思想 首先,确定第一个整数的范围,由于不能包含数字2和4,所以第一个整数的取值范围为[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 6, 7, 8, 9]。 然后,在确定第一个整…

DAY 45 企业级虚拟化技术KVM

企业级虚拟化技术KVM 1.kvm是什么 kernel virtualization machine 内核虚拟机 qemu的二次开发 软件全拼 qemu-kvm kvm virtulbox ovm vmware vsphere套件(vmawre-esxi) microsoft hyper-V 2.什么是虚拟化 资源利用 资源隔离 虚拟化管理&…

立创开源学习篇(一)

1.机壳地 外面包围的一圈是机壳地,和金属外壳相连与电路板的GND不相连:(大疆很多产品有此设计) 屏蔽和接地:通过在电路板周围打孔,并连接到机壳地,可以形成有效的电磁屏蔽层(形成金…

LabVIEW开发为什么沟通需求非常重要

在LabVIEW开发项目中,需求沟通是项目成功的基石。以下是需求沟通的重要性及其原因: 明确项目目标: 定义清晰的目标:通过与用户的沟通,可以明确项目的目标和范围,确保开发团队理解用户的实际需求&#xff0c…

Windows系统部署本地SQL_Server指引

Windows系统部署本地SQL_Server指引 此指引文档环境为Windows10系统,部署SQL_Server 2019为例,同系列系统软件安装步骤类似。 一、部署前准备; 下载好相关镜像文件;设备系统启动后,将不必要的软件停用,避…

4M-21:霸气侧漏高效的20+多模态AI模型

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技(Mamba,xLSTM,KAN)则…

Python的print,input与注释的使用

1.print的使用 2.input的使用 3.如何注释 1.print的使用 1.1建立俩个变量a,b,直接把变量放在print的括号里面就会打印其的值。 1.2print可以同时打印多个,打印ab的值与字符串‘11’。 1.3先用chr()函数去获取对应97…

CIC-DDoS2019-Detection

CIC-DDoS2019 对CIC-DDoS2019数据集进行检测,本文提供了如下内容: 数据清洗与合并机器学习模型深度学习模型PCA,t-SNE分析数据,结果可视化 代码地址:[daetz-coder](https://github.com/daetz-coder/CIC-DDoS2019-Detection) 1、数据集加载…

基于Flask+Mysql+EasyUI的简单用户管理系统

1、系统实现功能 添加用户查看用户修改用户删除用户 完整代码下载地址在最后,若显示链接不存在,可能是资源还没有审核,可私聊我发完整代码。 2、功能实现 2.1 添加用户 构建添加用户的Flask接口add_user() app.route("/add/user&quo…

计算机网络(谢希仁第六版)| 课后习题与答案 | 物理层 | 题目知识点详细分析

计算机网络(谢希仁第六版)课后习题与答案 物理层 博客只对老师给的重点进行整理,完整的课后习题答案见Gitee下载:《计算机网络教程(第6版)(微课版)》习题答案 2-5 请画出数据流1 0 1…

JavaFX 分页

分页控件用于浏览多个页面。 我们典型地使用对网页的分页控制,例如博客。 在博客页面的底部,我们可以看到一个矩形区域,作为一个数字列表来指示页面索引,以及一个下一个/上一个按钮来链接到下一个/上一个页面。 创建分页控件 分…

OpenCV中的圆形标靶检测——findCirclesGrid()(二)

本章我们开始讲解基于层次聚类的标靶检测算法。当我们调用如下API,且flags中包含cv::CALIB_CB_CLUSTERING标志位时,将会执行基于层次聚类的斑点检测算法。算法支持对称标靶和非对称标靶两类,相应的需要将下述flags设为包含CALIB_CB_SYMMETRIC_GRID或CALIB_CB_ASYMMETRIC_GRI…

安卓Context上下文

目录 前言一、Context简介二、Application Context2.1 Application Context的创建过程2.2 Application Context的获取过程 三、Activity的Context创建过程四、Service的Context创建过程 前言 Context也就是上下文对象,是Android较为常用的类,但是对于Co…

MySQL事务、数据库的存储引擎

1. 事务的概念 定义:事务就是一组数据库操作序列(包含一个或多个SQL操作命令),事务会把所有操作看作是一个不可分割的整体向数据库系统提交或撤销操作,所有操作要么都执行,要么都不执行。 1.1事务的 ACID …

重学java 74.Lombok的使用

少点心气,多点干劲 —— 24.6.18 一、lombok的安装使用 1.作用: 简化javabean开发 2.使用: a.下插件 ->如果是idea2022不用下载了,自带 b.导lombok的jar包 安装教程: http://t.csdnimg.cn/wq9MM c.修改设置 二、lombok的介绍 Lombok通过增加一…

短路是怎么形成的

1. 短路分为电源短路和用电器短路。 电源短路:电流不经过任何用电器,直接由正极经过导线流向负极,由于电源内阻很小,导致短路电流很大,特别容易烧坏电源。 用电器短路:也叫部分电路短路,即一根…

Java对象头的组成

介绍对象头之前先说一下Java对象内部的组成结构&#xff1a; 1&#xff0c;成员变量&#xff08;Data1...DataN&#xff09; 2, 对象头 Java对象头的组成&#xff08;根据对象头分析对象状态借此优化代码&#xff09; <dependency> <groupId>org.openjdk.jol&l…

Spring注解----------@Deprecated

情景&#xff1a; 在我们开发过程中&#xff0c;有时候会遇到我们需要将几个类中的方法集中到一个类中&#xff0c;但是我们又不希望把我们的原来的类删掉&#xff08;就是单纯的不想删除&#xff0c;都是我写的代码我不想杀死我的结晶&#xff0c;不能说我写的是shi&#xff…

再次递表港交所,慧算账能否把握AI+财税SaaS机遇?

5月以来&#xff0c;港股IPO市场日渐兴旺&#xff0c;多家公司实现上市首日“零破发”&#xff0c;平均收涨约30%&#xff0c;6月更是出现了超2500倍超购新股。市场赚钱效应显现&#xff0c;投资者打新随之热情高涨&#xff0c;越来越多国内企业也开始抓紧赴港上市。 近日&…