C++中的枚举(enum)

2023-05-16

C++中的枚举(enum)

枚举类型(enumeration)是 C++ 中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。

枚举是一个数值集合,是给一个值命名的一种方法。

如果想要使用整数来表示某些状态或者某些数值时,它非常有用。

不管怎么说,枚举其实就是一个整数,它的存在本质上是为了让代码更加干净,更加具有可读性。

看一个例子:

enum example {
    Aa, Bb, Cc
};

数据类型本身的名字是以大写字母开头的,虽然这并非必须,但是绝大多数程序员都会釆用首字母大写的形式

默认情况下,编译器设置第一个枚举量为 0,下一个为 1,以此类推。在上述示例中,Aa的值将是 0,Bb的值为 1,Cc的值为2,也可以手动给每个枚举量赋值:

enum example {
    Aa, Bb = 10, Cc
};

给Bb赋值为10后,Cc的值会变成11,这个需要注意。

还可以指定给枚举类型赋值的整数类型,枚举默认为32位整形,在某些情况下,甚至没必要用到32位,为了节省开销,甚至可以用8位整形:

enum example : unsigned char
{
    Aa, Bb = 10, Cc
};

将类型指定成unsigned char后,枚举变量变成了8位整型,减少了内存使用。

需要注意的是,不能指定为float或者double等类型,因为枚举量必须是一个整数,float和double都不是整数。

要意识到,enum语句示例实际上并没有创建任何变量,只是定义数据类型。当以后创建这个数据类型的变量时,它们看起来就是整数,并且这些整数的值被限制在与枚举集合中的符号名称相关联的整数上。

enum example
{
    Aa = 0, Bb, Cc
};
example ex;

此语句的形式与其他任何变量定义一样,首先是数据类型名称,然后是变量名称。请注意,数据类型名称是example ,而不是enum example。创建的变量ex会被限定在0,1,2中,我们也可以避开编译器的限制,因为这种不属于物理上无法设定的东西,它本质上就是4个字节的整数,它只有四个字节的内存,我们可以把任何想要的东西放到那块内存中。

即使枚举数据类型中的值实际存储为整数,也不能总是将整数值替换为符号名称。例如,不能使用下面的语句将 Aa 赋值给 ex

ex = 0;  //这种写法是不对的

但是,可以使用整数值而不是符号名称来测试枚举变量。例如,以下两个 if 语句是等效的:

if (ex == 0)
if (ex == Aa)

还可以使用关系运算符来比较两个枚举变量。

example ex1 = Aa, ex2 = Bb; 
if (ex1 > ex2)
{
    ……
}

例子:

日志类,不使用枚举:

#include <iostream>

class Log
{
public:


	const int LogLevelError = 0;
	const int LogLevelWarning = 1;
	const int LogLevelInfo = 2;

private:
	int m_LogLevel = LogLevelInfo;

public:
	void SetLevel(int level)
	{
		m_LogLevel = level;
	}

	void Warn(const char* message)
	{
		if (m_LogLevel >= LogLevelWarning)
			std::cout << "[WARNING]:" << message << std::endl;
	}
	void Info(const char* message)
	{
		if (m_LogLevel >= LogLevelInfo)
			std::cout << "[INFO]:" << message << std::endl;
	}
	void Error(const char* message)
	{
		if (m_LogLevel >= LogLevelError)
			std::cout << "[ERROR]:" << message << std::endl;

	}

};

int main()
{

	Log log;
	log.SetLevel(log.LogLevelWarning);
	log.Warn("This is a warning!");
	std::cin.get();
}

使用后,代码看起来干净很多:

#include <iostream>

class Log 
{
public:

    enum Level
    {
        LevelError = 0, LevelWarning, LevelInfo
    };

private:
    Level m_LogLevel = LevelInfo;

public:
    void SetLevel(Level level)
    {
        m_LogLevel = level;
    }
    void Warn(const char* message)
    {
        if (m_LogLevel >= LevelWarning)
            std::cout << "[WARNING]:" << message << std::endl;
    }
    void Info(const char* message)
    {
        if (m_LogLevel >= LevelInfo)
            std::cout << "[INFO]:" << message << std::endl;
    }
    void Error(const char* message)
    {
        if (m_LogLevel >= LevelError)
            std::cout << "[ERROR]:" << message << std::endl;
    }

};
int s_Variable;
const int a = 1;


int main()
{
    Log log;
    log.SetLevel(Log::LevelInfo);
    log.Warn("This is a warning!");
    std::cin.get();
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中的枚举(enum) 的相关文章

  • Enum枚举前后端传输展示方案

    1 定义枚举类型 public enum RolesTypeEnum implements Enumerator MANAGER 34 管理员 34 0 BUSINESS 34 招商员工 34 1 PROPERTY 34 物业员工 34 2
  • c++ enum class转int

    示例 enum class 定义 span class token keyword enum span span class token keyword class span span class token class name Colo
  • C++ enum 和enum class

    文章目录 C 43 43 enum 和 enum class共同点区别 C 43 43 enum 和 enum class 在C 43 43 中 xff0c enum 是一种定义枚举类型的方法 一个枚举是一个整数值的命名集合 可以通过以下方
  • C语言 -- enum 枚举的使用

    一 枚举的定义 枚举是C语言的一种基本的数据类型 enum 枚举名 枚举元素1 枚举元素2 我们以星期举例 enum DAY MON 61 1 TUE WED THU FRI SAT SUN 如果没有赋值 xff0c 第一个枚举成员的默认值
  • C#中的枚举 Enum和enum的区别

    枚举类型本质上是一个字典 xff0c 它将一组字符串映射到一组整数值 每个枚举常量都具有一个关联的整数值 xff0c 默认情况下 xff0c 第一个枚举常量的值为 0 xff0c 后续枚举常量的值会自动加 1 C 中有两种枚举类型 xff1
  • enum 与string的转换

    从enum转换为string可以用ToString 方法 xff0c 如果从string转化为enum xff1a var domInt 61 Convert ToString row 34 DomInt 34 FlightDomInt d
  • c语言枚举做字符类型转换,C# 枚举类型转换字符串 Enum to string

    c 枚举类型转换字符串 enum to string 枚举类型都是值类型 system enum是一个抽象类 abstract class xff0c 所有枚举类型都直接继承自它 xff0c 当然也同时继承了它的所有成员 所有的值类型都是s
  • 枚举(enum)

    一 什么是枚举 我们学习过单例模式 xff0c 即一个类只有一个实例 而枚举其实就是多例 xff0c 一个类有多个实例 xff0c 但实例的个数不是无穷的 xff0c 是有限个数的 例如word文档的对齐方式有几种 xff1a 左对齐 居中
  • C#语法小知识(三)枚举类型enum

    枚举类型声明一系列常数 xff0c 用于表示这个类型的变量可能会在这些常数里变化 我们在这篇文章里讲一下枚举类型的几个用法 一个简单的枚举类型的定义 xff1a enum TestEnum x y z 而使用也很简单 xff1a TestE
  • C/C++中枚举类型enum使用

    1 说明 xff1a 枚举enum的出现 xff0c 主要是为了解决一些特定属性的赋值 xff0c 变量取值仅在一定有限范围内的问题 例如一年只有十二个月取值 xff0c 一个星期只有七天情况 xff0c 人的性别只有男女两种等 这些属性如
  • 推荐一个C++枚举转字符串的开源项目magic_enum

    文章目录 前言magic enum简单介绍具体使用原理简述局限性 简化与改进总结 前言 C 43 43 11引入了强类型的枚举类 enum class 用来代替旧风格枚举enum xff0c 新引入的 enum class 具有诸多优点 x
  • C++详解:枚举类型 --- enum | Xunlan_blog

    文章目录 一 概念二 定义枚举元素表 三 定义枚举对象的操作 四 要点 amp 技巧实例 一 概念 枚举类型 enumeration xff0c 是C 43 43 中的一种派生数据类型 xff0c 是用户创建的一个集合 xff0c 可以增加
  • java枚举(enum)使用详解

    文章目录 前言一 枚举类型定义二 访问成员三 遍历四 在switch xff08 xff09 中使用枚举五 方法1 内置方法1 1 ordinal 用于返回成员的索引1 2 compareTo 用于比较枚举类型中两个成员的索引值1 3 va
  • 枚举(enum)

    一 什么是枚举 我们学习过单例模式 xff0c 即一个类只有一个实例 而枚举其实就是多例 xff0c 一个类有多个实例 xff0c 但实例的个数不是无穷的 xff0c 是有限个数的 例如word文档的对齐方式有几种 xff1a 左对齐 居中
  • enum枚举类型作为成员变量

    Enum是枚举类型 定义形式一 xff1a Enum 枚举类型名 枚举常量1 xff08 61 0 xff09 xff0c 枚举常量2 xff08 61 0 xff09 xff0c 枚举变量1 xff08 xff0c 枚举变量2 xff0c
  • 深入理解Java枚举类型(enum)

    版权申明 未经博主同意 xff0c 谢绝转载 xff01 xff08 请尊重原创 xff0c 博主保留追究权 xff09 http blog csdn net javazejian article details 71333103 出自 z
  • C语言--符号常量

    在C语言中 可以用一个标识符来表示一个常量 称之为符号常量 其特点是编译后写在代码区 不可寻址 不可更改 属于指令的一部分 一 符号常量定义用 define 符号常量在使用之前必须先定义 其一般形式为 形式为 define 标识符 常量 e
  • Java,Enum里定义属性和方法

    最近的项目用到了大神写的统一返回码的代码 ErrorCode java 统一6位 异常码 author Administrator public enum ErrorCode global OK 000000 操作成功 ERROR 0000
  • C# 枚举 enum(学习心得 17)

    枚举是一组命名整型常量 枚举类型是使用 enum 关键字声明的 C 枚举是值类型 枚举包含自己的值 且不能继承或传递继承 超级小白友好 讲解C 基础 每集5分钟轻松学习 拒绝从入门到放弃 声明 enum
  • C语言枚举类型的大小

    主流编译器如 gcc vc MinGW gcc等枚举变量均为4字节 少量编译器会根据枚举个数做优化 如只有3个枚举值时 size可能为1 enum长度不确定会带来可移植性问题 如果第三方库API接口使用enum类型 编译和调用库时一旦有关e

随机推荐

  • CAShapeLayer动画(画圆效果)

    关于CAShapeLayer和DrawRect的比较 DrawRect xff1a DrawRect属于CoreGraphic框架 xff0c 占用CPU xff0c 消耗性能大 CAShapeLayer xff1a CAShapeLaye
  • iOS调用各大地图APP导航,进行路线规划

    最近收到了这么一个需求 xff0c 就是支持目前主流的地图APP导航 xff0c 也就是说跳转至第三方应用 说实在的一开始我是拒绝的 xff0c 不过最后还是做了 xff0c 全是体力活 xff0c 为了方便大家 xff0c 我就终结一下
  • stm32cubeMX+vscode开发编译调试stm32程序

    stm32cubeMX 43 vscode开发编译调试stm32程序 安装vscode安装make工具安装交叉编译工具链安装openocd安装clang llvm生成并编译代码配置vscode安装插件配置文件c cpp properties
  • 如何在 Ubuntu 20.04 上安装 Jenkins?

    介绍 当面临重复性技术任务时 xff0c 寻找可行的自动化解决方案可能是一件苦差事 使用开源自动化服务器 Jenkins xff0c 您可以有效地管理从构建到部署软件的任务 Jenkins 是基于 Java 的 xff0c 从 Ubuntu
  • 并查集

    先上题目 题目描述 如题 xff0c 现在有一个并查集 xff0c 你需要完成合并和查询操作 输入格式 第一行包含两个整数N M xff0c 表示共有N个元素和M个操作 接下来M行 xff0c 每行包含三个整数Zi Xi Yi 当Zi 61
  • 使用PN532进行IC卡的Linux和Windows平台的数据读取以及写入过程

    强调 xff1a 勿用于非法用途 本文介绍使用PN532进行IC卡的Linux和Windows平台的数据读取以及写入过程 注意 xff1a 在树莓派平台只做到了卡片解密 xff0c 并没能写入UID卡 xff0c 我不清楚具体原因 xff0
  • 必须要掌握的单链表操作大全

    前言 号外号外 xff0c 笔者最近在系统整理一些 Java 后台方面的面试题和参考解答 xff0c 有找工作需求的童鞋 xff0c 欢迎关注我的 Github 仓库 xff0c 如果觉得不错可以点个 star 关注 xff1a 1 awe
  • python数据处理(数据集的格式转换)

    摘要 本文总结常常用到的一些数据处理方法 xff0c 主要是numpy和python 数组 列表 字典的操作 一 保存N维数组 ndarray 到本地文件 本节参考原文在此 xff0c 本节复述目的是防止丢失 xff0c 时常复习 1 需求
  • python实现三维坐标旋转计算

    参考文章 xff1a python实现三维坐标旋转计算 空间三维坐标系旋转计算 计算空间三维坐标系变换一般都是利用旋转矩阵或者欧拉公式 python有个scipy库可以直接用于计算空间三维坐标变换 支持库 pip install scipy
  • Start request repeated too quickly解决方法

    脚本重启时间太快 xff0c 不清楚是什么原因 可能是默认的重启时间为0 1秒 可以添加StartLimitInterval 61 600 xff0c 600表示600秒 span class token punctuation span
  • opencv VideoWriter 保存文件,只有6k

    frame size的原因 xff0c videowriter创建的视频文件的size和要写入的frame size不一致
  • pip安装模块报错:File “D:\python\lib\site-packages\pip\_vendor\urllib3\response.py“, line 507, in read

    以下文章内容参考自 xff1a https blog csdn net qq 43348979 article details 115983927 解决参考原博 xff1a https blog csdn net liji digital
  • 自用git命令

    添加git默认信息 git config add user name 61 34 xxx 34 git config add user email 61 34 xxx 34 远程操作 git remote add origin xxxxx
  • npx命令

    参考文章 xff1a npx是什么命令 xff1f npx和npm有什么区别 xff1f 平时安装node模块的时候 xff0c 经常使用的命令是npm 其实还有另外一个命令 xff0c 叫做npx 网上的说法都是 xff1a npx是np
  • CSS替换元素

    参考文章 xff1a 替换元素 非替换元素 行内替换元素 行内非替换元素 img input到底是行内还是块级元素 xff1f 问题 xff1a img input到底是行内还是块级元素 xff1f 为什么有的行内元素可以撑开父元素 xff
  • PostgreSQL 查询怎么取到json中的字段值 有几种方法

    在PostgreSQL中可以使用多种方法来取到JSON中的字段值 xff0c 以下是其中的三种常用方法 xff1a 1 通过 gt 操作符取值 gt 操作符用于从JSON对象中提取一个键的值 例如 xff0c 假设有一个JSON对象 nam
  • Spring Data Jpa 使用关键字定义查询

    1 创建接口 BookDao java span class token keyword package span top span class token punctuation span woilanlan span class tok
  • 应用服务OkHttpClient创建大量对外连接时内存溢出

    文章目录 1 背景2 排查 2 1 原因 2 2 验证过程2 2 1 修改前2 2 2 修改后 3 解决 1 背景 最近工作中碰到一个生产问题 xff0c 就是应用服务在使用 OkHttpClient 时 xff0c 在创建大量对外连接时线
  • debian11安装docekr

    卸载旧版 apt get remove docker docker engine docker io containerd runc apt get purge docker ce docker ce cli containerd io d
  • C++中的枚举(enum)

    C 43 43 中的枚举 enum 枚举类型 enumeration 是 C 43 43 中的一种派生数据类型 xff0c 它是由用户定义的若干枚举常量的集合 枚举是一个数值集合 xff0c 是给一个值命名的一种方法 如果想要使用整数来表示