P15 C++ 枚举

news2024/11/25 4:32:35

@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;
}

最后的话

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

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

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

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

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

相关文章

【MATLAB】VMD分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 VMD&#xff08;Variational Mode Decomposition&#xff09;是一种信号分解方法&#xff0c;基于HHT&#xff08;Hilbert-Huang Transform&#xff0c;希尔伯特-黄变换&#xff09;。HH…

理论与实践相结合之白话文讲解计算机网络是什么

什么是计算机网络&#xff1f; 下图就是计算机网络&#xff0c;所有能联网的设备连接在一起就组成了互联网 计算机网络有什么用&#xff1f; 计算机网络的作用就是用于设备之间传输数据&#xff0c;举个例&#xff0c;我们用手机或电脑可以访问“百度”&#xff0c;是因为我们…

Vue - Vue配置proxy代理,开发、测试、生产环境

1、新建三个环境的配置文件 在src同级目录也就是根目录下新建文件&#xff1a;.env.development&#xff08;开发环境&#xff09;、.env.test&#xff08;测试环境&#xff09;、.env.production文件&#xff08;生产环境&#xff09; 2、三个环境的配置文件 开发环境 .env…

【【Linux开发环境搭建与软件的安装】】

Linux开发环境搭建与软件的安装 下面我们来讲述 Ubuntu 系统搭建 tftp 服务器 TFTP 需要一个文件夹来存放文件&#xff0c;我们在根目录下新建一个/tftpboot 目录做为 TFTP 文件存储目录&#xff0c;之所以使用该目录是因为后面使用的 Petalinux 工具默认使用该目录&#xff0…

GCPS—20型工程钻机的设计自动摊铺机的设计机械设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;摊铺机 获取完整论文报告工程源文件 摊铺机是一种复合式多功能摊铺机&#xff0c;为适应我国深基础和连续墙以及水利、纺织的发展与需要&#xff0c;结合大口径摊铺机灌注桩和地下连续墙施工的特点&#xff0c;为解决在复…

【方块消消乐】方块消除游戏-微信小程序开发流程详解

有做过俄罗斯方块游戏小程序的经验&#xff0c;这次有做了一个消灭方块的游戏&#xff0c;实现过程很顺利&#xff0c;游戏看着和之前做的俄罗斯方块游戏很像&#xff0c;这里调整了玩法&#xff0c;试玩感觉还可以&#xff0c;接下来给大家讲一讲消灭方块游戏开发过程。 俄罗斯…

多元逻辑回归模型的概念、模型检验以及应用

多元逻辑回归是逻辑回归的一种扩展&#xff0c;用于处理多类别分类问题。在二元逻辑回归中&#xff0c;我们通过一个逻辑函数&#xff08;也称为S形函数&#xff09;将输入特征映射到一个概率值&#xff0c;用于预测两个类别中一个的概率。而在多元逻辑回归中&#xff0c;我们面…

How to show square root of absolute of x isn‘t Lipschitz function

https://math.stackexchange.com/questions/667346/sqrtx-isnt-lipschitz-function https://math.stackexchange.com/questions/1375829/how-to-show-square-root-of-absolute-of-x-sqrtx-is-not-lipschitz-continu?noredirect1

新手如何购买保险,保险投资基础入门

一、教程描述 本套保险教程&#xff0c;大小2.63G&#xff0c;共有11个文件。 二、教程目录 第01课 保险到底有什么用.mp4 第02课 已有社保还需要商业保险吗.mp4 第03课 你必须要懂的保险基础知识.mp4 第04课 关于重疾你必须要知道的几件事情.mp4 第05课 家庭重疾险如何…

掌握文件夹重命名技巧:字母大小写批量转换的实用操作

在这个数字化时代&#xff0c;经常要与各种文件和文件夹打交道。有时候&#xff0c;为了提高工作效率或整理文件&#xff0c;要对文件夹名称进行修改。其中&#xff0c;字母大小写的转换是一个常见的需求。例如&#xff0c;将所有文件夹名称中的大写字母转换为小写字母&#xf…

4.一维数组——用数组处理求Fibonacci数列前20项

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、结果显示 前言 本系列为一维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 用数组处理求Fibonacci数列前20项 二、题目分析 前两项&#xff1a;f[20]{1,1} 后18项&#xff1a;for(…

企业文档文件管理软件推荐:提升管理效率与数据安全性

Zoho WorkDrive企业网盘是一种高效的文件管理工具&#xff0c;它不仅可以为组织搭建统一、高效、安全、智能的内容管理体系&#xff0c;还能够提供大规模支撑、海量数据处理、非结构化数据治理、智能挖掘与洞察等服务能力。通过这些服务&#xff0c;企业可以更好地管理和利用其…

岁月随笔-穿拖鞋的汉子

时间如白驹过隙般&#xff0c;转眼间2023年也只剩下最后的40天。汉子我拿出年初自己定的目标&#xff0c;立下的Flag&#xff0c;恍恍惚若昨天发生&#xff0c;不禁让人感慨万千。 其实最近自己遇到了很大的困惑&#xff0c;也导致了断更了一个月。自己逐渐摸不清自己的定位啦…

软件测试面试题之如何进行项目介绍

邯郸网上银行系统旨在为企业搭建安全便捷的账户管理&#xff0c;资金汇化及投资服务通道&#xff0c;提升企业财富与价值增值它主要包含首页、我的账户、信用卡、邮储业务、投资理财、转账汇款、个人贷款等模块。 个人贷款一般有抵押贷款&#xff0c;和信用贷等&#xff0c;房…

SpringBoot事务处理

一、事务回顾 回顾地址&#xff1a; 深入理解数据库事务&#xff08;超详细&#xff09;_数据库事务操作_Maiko Star的博客-CSDN博客 事务&#xff1a; 是一组操作的集合&#xff0c;是一个不可分割的工作单位&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败 事…

什么是 dropblock

大家好啊&#xff0c;我是董董灿。 之前介绍过 dropout 算法&#xff0c;它在训练神经网络中&#xff0c;可以随机丢弃神经元&#xff0c;是一种防止网络过拟合的方法。 但是在卷积神经网络中&#xff0c;dropout 的表现却不是很好&#xff0c;于是研究人员又搞了一个“结构化…

五大自动化测试的 Python 框架

1、Selenium: Selenium 是一个广泛使用的自动化测试框架&#xff0c;用于测试Web应用程序。它支持多种浏览器&#xff0c;并通过模拟用户在浏览器中的操作来进行测试。Selenium 的 Python 客户端库是 Selenium WebDriver&#xff0c;它提供了一组API来编写测试脚本&#xff0c…

系列十八、Spring bean线程安全问题

一、概述 我们知道Spring中的bean&#xff0c;默认情况下是单例的&#xff0c;那么Spring中的bean是线程安全的吗&#xff1f;这个需要分情况考虑&#xff0c;bean中是否存在成员变量&#xff1f;bean中的成员变量是怎么处理的&#xff1f;...&#xff0c;针对bean的状态会有不…

【挑战业余一周拿证】一、亚马逊云科技简介 - 第 1 节 - 模块 1 简介

CSDN 官方中文视频&#xff08;免费&#xff09;&#xff1a;点击进入 一、亚马逊云科技简介 第 1 节 - 模块 1 简介 1、讲师&#xff1a;李锦鸿 部门&#xff1a;亚马逊云科技培训与认证部门 方向&#xff1a;从事数据中心及云计算相关产品与解决方案工作 课程&#xff…

【Linux系统编程】冯 • 诺依曼体系结构(什么是冯 • 诺依曼体系结构?冯 • 诺依曼体系结构如何应用?)

目录 一、前言 二、什么是冯 • 诺依曼体系结构&#xff1f; &#x1f4a6; 冯 • 诺依曼体系结构的发展推导 &#x1f4a6;冯 • 诺依曼体系结构的5大部件 ⭐输入和输出设备 ⭐存储器 ⭐中央处理器&#xff08;CPU&#xff09; &#x1f4a6;冯 • 诺依曼体系结构的细节…