P15 C++ 枚举

@The ChenPi

前言

今天我们要讲的是 C++ 中的枚举。

enum 是 enumeration 的缩写,基本上可以说,它就是一个数值集合。如果你想要给枚举一个更实际的定义,它们是给一个值命名的一种方法。

所以我们不用一堆叫做 A、B、C 的整数。我们可以有一个枚举数。它的值是A、B、C。它们与整数相对应。这能帮助我们将一维数值集合作为类型,而不仅仅是用整型作为类型。

当然你可以给它赋值任何整数,也就是设置哪些值可以赋值。

枚举其实一点都不复杂,就是这些了。它只是一种命名值的方法,当你想要使用整数来表示某些状态或者某些数值时,它非常有用。

01 为什么使用枚举

让我们来看看具体的看例子吧。

#include <iostream>

int A = 0;
int B = 1;
int C = 2;

int main()
{
    int value = A;
    if(4 == value)
    {

    }
    return 0;
}

我有三个值要处理。我们把 A 设为 0,B 设为1,C 设为 2。然后在 main 的某个地方使用 value 变量。先让它等于这三个中的一个,然后通过一些代码来检查当前的 value 值是什么,然后执行某种操作。

很好,然而这样会带来一些问题。

这些 ABC 根本就没有分组,在代码后面的某个地方,你可能会有一个 D,或者你可能想再次声明 A,这就成了一个问题。——本质上最大的问题还是这些变量根本没有分组。

此外,它们只是整数。

这也就意味着我可以在将 value 值的直接赋值为 5,那它下面的代码就没有意义了。

我们希望能够从本质上定义一个类型,它只能是这三个数中的一种,而且能够把它们组合起来。——这里正是我们使用枚举的地方。

02 如何使用枚举

我们对代码做一些修改。

我创建一个枚举 enum。叫作 Example,然后我可以列出我想要的值。例如 A、B 或 C。这里不用 int 作为类型了。

现在我们可以使用枚举的名称作为实际类型。

#include <iostream>

enum number_type
{
    A = 0,B,C
};

int main()
{
    number_type value = A;
    if(-1 == A)
    {

    }
    return 0;
}

这样就可以正确的使用枚举了。我们可以像例子中那样赋值。

如果我尝试赋别的值,会得到一个错误。——因为它必须是上面三个中的一个。

而且你要记住一点。这里面的值只能是整数

好了,接下来可以做之前想做的操作了。比如我会这样写。

你这个时候会有一个疑问。——我怎么知道 B 的值是多少?

你把鼠标悬停在第五行,查看 ABC 的值。可以清楚的看到 A 的值是 0,B 的值是 1,C 的值是 2。这些值是默认的,它默认第一个是 0,然后它一个接一个的递增。

你也可以直接指定它们的值,你想要设置成多少都可以。

如果你从一个非 0 的数字开始(比如 5),没有指定其余的值,你可以看到后面的 B 的值变为了6,C的值是7。就是这样递增的。

这里还可以做的另外一件事,是指定你想要给枚举赋值的整数类型。

这样做的的作用是:设置每一个数据的类型是 8 位整型。默认是 32 位的整型,——其实没有必要用那么大的数字是吧。

所以这样做减少了内存的使用。

不过千万要记住,这里不能使用 float。float 不是整数,这里必须是一个整数,比如char。

这就是枚举的本质,它只是给特定的值命名的一种方式。然后你就不必在各种地方处理各种整数了。

03 日志Log使用枚举的例子

让我们来看一个真正的例子,你可能会在这里使用枚举。

我们有一个日志类,这个类在 如何写一个 C++ 类 那一期讲过。

我们先简单的回顾一下那个程序。

#include <iostream> 

class Log
{
public:
    const int LogLevelError = 0; //日志级别Error = 0
    const int LogLevelWarning = 1; //
    const int LogLevelInfo = 2; //

private:
    int m_level;  //私有的变量,用于类的内部

public:
    void setLevel(int level)   //设置日志级别
    {
        m_level = level;    //
    }
    void Error (const char* messge)   //打印错误级别的日志信息
    {
        if(m_level >= LogLevelError)
            std::cout << messge << std::endl;
    }

    void warning(const char* messge)   //打印警告级别的日志信息
    {
        if(m_level >= LogLevelWarning)
            std::cout << messge << std::endl;
    }

    void Info(const char* messge)   //打印正常级别的日志信息
    {
        if(m_level >= LogLevelInfo)
            std::cout << messge << std::endl;
    }

};


int main()
{
    Log log;
    log.setLevel(log.LogLevelWarning);   //日志级别设为warning 1
    log.warning("hello ,this is warning");
    log.Error("hello,this is Error"); //
    log.Info("this is Info"); //
    return  0;
}

在这里我们使用了三个不同的 log 级别。它们只是整数 0、1、2。可以看到这是一个非常适合用枚举的地方。

因为我们有三个值,我们用它们作为整数来表示某个状态。

这个例子中的日志级别是指会展示哪种级别的日志。

接下来我们在这个类中创建一个名叫 Level 的枚举。

你可以看到我显示的把这个 LogleveError、LogleveWarning、LogleveInfo 设置为 0、1、2。我个人很喜欢这样做,这样可以帮助代码提高可读性。

然后删除下面的几个定义,最后调整成现在这个样子。

我们将它设置为枚举,等于是加了条件,它只能是那三个值了(纯粹从语法上 C++ 编译器会强制执行这些限制,但你也可以很容易的绕过它。它不是那种从物理上都无法设定的东西)。当然,我们的枚举数只是四字节的整数,只有四个字节的内存,你可以可以把任何你想要的东西放进那个内存里。

ok,我们通过设置类型为 Level 来限制我们的代码。

将下面的代码也做一些修正。

然后是主程序当中的 SetLevel 函数。

你会发现这里的设置有点不太一样。我们有一个枚举数叫做 Warning。在 Log 这个类的命名空间中,这个枚举 Level 本身不是一个命名空间,这个叫做枚举类

然而,对于普通的枚举而言,Level 并不是真正的命名空间,所以你不能把它当成一个命名空间,就意味着 Warning 和 Info 它们只存在于这个日志类中。你看到我可以把它设置为 Warning。

现在程序一切正常了。

最后修改过的代码

#include <iostream> 

class Log
{
public:
    enum LogLevel
    {
        LogLevelError = 0,LogLevelWarning,LogLevelInfo
    };

private:
    LogLevel m_level = LogLevelInfo;  //私有的变量,用于类的内部

public:
    void setLevel(LogLevel level)   //设置日志级别
    {
        m_level = level;    //
    }
    void Error (const char* messge)   //打印错误级别的日志信息
    {
        if(m_level >= LogLevelError)
            std::cout << messge << std::endl;
    }

    void warning(const char* messge)   //打印警告级别的日志信息
    {
        if(m_level >= LogLevelWarning)
            std::cout << messge << std::endl;
    }

    void Info(const char* messge)   //打印正常级别的日志信息
    {
        if(m_level >= LogLevelInfo)
            std::cout << messge << std::endl;
    }

};

int main()
{
    Log log;
    log.setLevel(Log::LogLevelWarning);   //日志级别设为warning 1
    log.warning("hello ,this is warning");
    log.Error("hello,this is Error"); //
    log.Info("this is Info"); //
    return  0;
}

最后的话

枚举的本质就是让我们的编码更容易,让我们的代码更干净。

在枚举的后面其实就是整数,你可以把它们用在很多地方。枚举有很多很多用途

好了,记住:如果你有一个数值集合想要用数字来表示它们,那么枚举就是你想要的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【好玩的 Docker 项目】搭建一个完全自由的音乐播放软件 ————Navidrome 随时随地!想听就听!

前言 随着国内版权意识的提高,现在想听一首歌曲,往往我们可能要切换 3-4 个 APP—— 网易云音乐、QQ 音乐、咪咕音乐…… 切换起来很麻烦,有的 APP 就算你买了 VIP 服务,下载的歌曲还是加密的,一旦 VIP 到期后某些歌你还听不了,非常蛋疼。 顺哥博客 最近被朋友推荐入了…

【Amazon】通过直接连接的方式导入 KubeSphere集群至KubeSphere主容器平台

文章目录 一、设置主集群方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 二、在主集群中设置代理服务地址方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 三、登录控制台验证四、准备成员集群方式一&#xff1a;使用 Web 控制台…

《已解决: ImportError: Keras requires TensorFlow 2.2 or higher 问题》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

18. Python 数据处理之 Numpy

目录 1. 简介2. 安装和导入Numpy3. ndarray 对象4. 基本运算5. 索引、切片和迭代6. 条件和布尔数组7. 变换形状8. 操作数组 1. 简介 数据分析的流程概括起来主要是&#xff1a;读写、处理计算、分析建模和可视化4个部分。 Numpy 是Python 进行科学计算&#xff0c;数据分析时…

卷积神经网络经典backbone

特征提取是数据分析和机器学习中的基本概念&#xff0c;是将原始数据转换为更适合分析或建模的格式过程中的关键步骤。特征&#xff0c;也称为变量或属性&#xff0c;是我们用来进行预测、对对象进行分类或从数据中获取见解的数据点的特定特征或属性。 1.AlexNet paper&#…

C/C++ 通过SQLiteSDK增删改查

SQLite&#xff0c;作为一款嵌入式关系型数据库管理系统&#xff0c;一直以其轻量级、零配置以及跨平台等特性而备受青睐。不同于传统的数据库系统&#xff0c;SQLite是一个库&#xff0c;直接与应用程序一同编译和链接&#xff0c;无需单独的数据库服务器进程&#xff0c;实现…

[LaTex]arXiv投稿攻略——jpg/png转pdf

一、将图片复制进ppt&#xff0c;右键单击图片选择设置图片格式&#xff0c;获取图片高度和宽度 二、选择“设计-幻灯片大小-自定义幻灯片大小” 三、设置幻灯片大小为图片大小 四、 选择“最大化” 五、 检查幻灯片大小是否与图像大小一致 六、导出为PDF

Doris单机部署——2.0.1.1版本

目录 一、前期准备工作 1.设置系统最大文件打开句柄数 2.时钟同步 3.关闭每台机器的交换分区 4.下载安装包 二、单节点部署安装Doris (一)安装fe 1.解压改名 2.修改配置文件 3.创建元数据目录 4.启动fe 5.访问fe的webUI (二)安装be 1.进入be目录下&#xff0c;修…

紫光展锐 展讯芯片 展讯处理器解锁BL 各分区结构 ROM 分区列表代表什么 bin img 表示什么意思

是展锐 Android 10.0、Android 9.0 平台 ROM 空间划分情况以及分区格式、分区大小和分区功能的 初步描述。 prodnv 开机后系统中的 productinfo 分区&#xff0c;保 存 adc 校准参数、eng.db 数据库。 Miscdata 保存 ota、recovery 时的一些数据 recovery 存放 recovery.i…

【数据中台】开源项目(1)-LarkMidTable

LarkMidTable 是一站式开源的数据中台&#xff0c;实现中台的 基础建设&#xff0c;数据治理&#xff0c;数据开发&#xff0c;监控告警&#xff0c;数据服务&#xff0c;数据的可视化&#xff0c;实现高效赋能数据前台并提供数据服务的产品。 系统演示地址 &#xff1a; www.l…

Simulink 的代数环

代数环, 就是由于模型的输出反馈到模块或子系统先的某个输入端, 如果这个输入是直接馈入的, 那么二者在同一个采样点内需得到求解, 但又互相依赖, 哪一方都不能完成求解过程, 使得解算器无法解算导致错误产生, 这样的情况称为代数环。 一旦 Simulink 遇到代数环, 将根据 Confi…

交换机配置与管理

文档以国产迈普交换机为例&#xff0c;各厂家交换机配置有少许不同&#xff0c;仅供参考。 交换机命令行模式&#xff1a; 普通用户模式Hostname>&#xff08;&#xff09; exit 输入enable命令 特权用户模式Hostname#&#xff08;&#xff09; exit 输入configu…

BrokerChain

BrokerChain: A Cross-Shard Blockchain Protocol for Account/Balance-based State Sharding 我总感觉这篇文章不完整&#xff0c;缺少一些东西。或者说有些地方并没有详细说。比如状态图的构建&#xff0c;网络重分片的的配置过程。都直接忽略了。 Motivation 1 跨片交易不…

Adversarial Attack on Graph Structured Data(2018 PMLR)

Adversarial Attack on Graph Structured Data----《图结构数据的对抗攻击》 摘要 基于图结构的深度学习已经在各种应用中显示出令人兴奋的结果。然而&#xff0c;与图像或文本对抗攻击和防御的大量研究工作相比&#xff0c;此类模型的鲁棒性却很少受到关注。在本文中&#xf…

【漏洞复现】Array VPN任意文件读取漏洞

漏洞描述 华耀(中国)科技有限公司(简称:Array)于2003年创建于北京,是优秀的网络功能平台解决方案提供商,也是应用交付解决方案、移动应用接入(SSL VPN)解决方案的全球领导者。华耀现有员工200余人,其中研发团队占到100余人,总部位于北京。并在北京、上海、广州、杭…

知识点小总结

‘Integer(int)‘ 已经过时了 https://blog.csdn.net/qq_43116031/article/details/127793512 解决Java中的“找不到符号“错误 解决Java中的“找不到符号“错误_java: 找不到符号_很酷的站长的博客-CSDN博客 可右键打开 错误: 编码 UTF-8 的不可映射字符 错误: 编码 UTF-8 …

1603. 整数集合划分(2016年408数据结构算法题)

一、题目 1603. 整数集合划分https://www.acwing.com/problem/content/description/1605/ 二、算法的基本设计思想 由题意知&#xff0c;将最小的 个元素放在 中&#xff0c;其余的元素放在 中&#xff0c;分组结果即可满足题目要求。仿照快速排序的思想&#xff0c;基于枢…

面向对象编程:Rust的面向对象特性

欢迎关注我的公众号lincyang新自媒体&#xff0c;回复关键字【程序员经典书单】&#xff0c;领取程序员的100本经典书单 大家好&#xff01;我是lincyang。 今天我们将深入探讨Rust语言中的面向对象编程&#xff08;OOP&#xff09;特性&#xff0c;并将其与其他流行编程语言进…

C语言之指针知识点总结

C语言之指针知识点总结 文章目录 C语言之指针知识点总结1. 初识指针1.1 取地址操作符 &1.2 指针变量1.3 解引用操作符 *1.4 指针变量1.4.1 大小1.4.2 指针类型的意义 1.5 void*指针1.6 const关键字1.61 const修饰变量1.6.2 const修饰指针变量 1.7 指针的运算1.7.1 指针-整数…

微信小程序便民小工具源码

微信小程序便民小工具源码,包含身材计算&#xff0c;房贷计算器&#xff0c;工资计算器&#xff0c;血型计算器&#xff0c;进制计算器&#xff0c;量角器&#xff0c;计数器等便民工具。 微信扫一扫即可预览 微信扫一扫即可预览 下载链接:https://www.ym4j.com/program/7525