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

C++中的枚举(enum)相关推荐

  1. java如何映射mysql枚举_java中自定义枚举enum映射到mysql数据库字段处理器handler

    mybatis中默认的处理枚举类型的handler有 如果要处理一些特殊的情况下字段内容字段的转换,需要自定义处理器,比如如下例子要处理数据库中默认字段值为""空字符串的问题 im ...

  2. iOS中的枚举:enum, NS_ENUM, NS_OPTIONS的使用区别

    1.enum可以声明一般类型和位掩码(bitmasked)类型 例如: enum Test{// 一般枚举 TestA, TestB, TestC, }; enum{// 匿名枚举 TestA, Te ...

  3. java中的枚举_Java中的枚举

    java中的枚举 Enum was introduced in Java 1.5 as a new type whose fields consists of a fixed set of const ...

  4. Swift中一个类中的枚举(enum)类型的数据该如何实现序列化(NSCoder)

    简述 昨天在开发中遇到了这样一个问题,需要用NSUserDefaults持久化一些数据,其中需要保存一个自己定义的类对象.这就需要我们去实现序列化与反序列化,即把对象转化成二进制数据存入取出时再将二进 ...

  5. .NET中的枚举(Enum)

    摘要:.NET中的枚举分为简单枚举和标志枚举,这次主要总结一下标志枚举适用条件,以及它的使用方法,并在文章的最后列举枚举使用的一些规范. 在刚接触.NET的枚举时,只用简单的枚举,对于标记枚举,只知道 ...

  6. java 枚举_Java中的枚举类型(Enum)详解

    文章前记 程序员工作久了便可能整日忙碌于"增删改查"中,迷失方向,毫无进步. 该公众号致力于分享软件开发相关的原创干货,助你完成从程序员到架构师的进阶之路! 努力!做一个NB的Co ...

  7. java 枚举 下拉框_枚举enum在velocity模板语言中的应用-下拉菜单

    1. velocity模板vm页面 语言: #if("add" == $flag) #foreach($elem in $languageEnum) $elem.name #end ...

  8. Java、Mysql、MyBatis 中枚举 enum 的使用

    From: https://yulaiz.com/java-mysql-enum/ Java 和 MySql 中都有枚举的概念,合理的使用枚举,可以让代码阅读和数据库数据查询更加直观.高效.那么我们怎 ...

  9. java中 enum什么意思_Java中枚举Enum的使用详解

    在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类: 在 Java 中使用 enum 关键字来定义枚举类,其地位与 clas ...

最新文章

  1. springcloud与dubbo对比:
  2. TLD文件中body-content四种类型(能力工场)
  3. sklearn快速入门教程 -- 机器学习工具的快速入门指引
  4. Python日志记录:在配置文件中指定日志格式化程序的转换器属性
  5. react(82)--方法写在effects里面
  6. Django学习知识点、路线图、资料总结大全,建议收藏!
  7. CentOS_6配置163网络yum源
  8. python如何发布项目_python如何发布自已pip项目的方法步骤
  9. excel mysql乱码_excel打开是乱码的解法方法
  10. 夏昕.深入浅出Hibernate中的第一个例子体会.
  11. Cannot create fileC:\Users\LML\AppData\Local\Temp\EditorLineEnds.ttr。另一个程序正在使用此文件,进程无法访问。
  12. linux 如何清理垃圾文件,Linux系统怎样清理垃圾文件
  13. BMapGL实现地图轨迹运动(地图视角不变)
  14. linux之进程观察命令:ps和top
  15. QingCloud Insight 2016 | 科技,洞见未来
  16. ubuntu 16.04 内存清理方法总结
  17. 利用selenium库实现QQ空间点赞
  18. 大数据的数据库设计原则有哪些
  19. css3动态测试网址
  20. 外键约束的创建及例子

热门文章

  1. pressOn在线制作流程图、思维导图、架构图等
  2. winxp 关闭445端口
  3. 复变函数 | 第一部分 复数
  4. 高德地图的点聚合效果下的点的添加和删除
  5. 快来智影:微电影的拍摄技巧
  6. 悟已往之不谏,知来者之可追。
  7. 【kafka】Error while fetching metadata xxx: {TEST=LEADER_NOT_AVAILABLE}
  8. python 标准正态分布函数_Python中的正态分布统计
  9. python爬取音乐源码_手把手教你使用Python抓取QQ音乐数据(第一弹)
  10. Docker的镜像制作与整套项目一键打包部署