C++ 允许程序员创建自己的数据类型,比如本节要将的枚举类型。枚举数据类型是一种由程序员定义的数据类型,其合法值是与它们关联的一组命名整数常量。

之所以被称为枚举类型,就是因为命名常量是作为数据类型定义的一部分而枚举或列出的,以下是枚举类型声明的示例:

enum Roster {Tom, Sharon, Bill, Teresa, John};

该语句将创建一个名为 Roster 的数据类型。因为单词 enum 是 C++ 关键字,所以它必须小写,值得注意的是,数据类型本身的名字是以大写字母开头的。虽然这并非必须,但是绝大多数程序员都会釆用首字母大写的形式。

和 Roster 数据类型关联的命名整数常量被称为枚举量,Roster 数据类型的变量可能只是关联到这些枚举量的值之一,但它们的值是什么呢?

默认情况下,编译器设置第一个枚举量为 0,下一个为 1,以此类推。在上述示例中,Tom 的值将是 0,Sharon 的值为 1,等等。最后一个枚举量 John 的值为 4。

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

Roster student;

此语句的形式与其他任何变量定义一样,首先是数据类型名称,然后是变量名称。请注意,数据类型名称是 Roster,而不是 enum Roster。

现在已经创建了 student 变量,它可以被赋予一个值,如下所示:

student = Sharon;

变量的值可以这样测试:

if (student == Sharon)

请注意,在这两个例子中,Sharon 周围没有引号。因为它是一个命名常量,而不是字符串常数。

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

student = 1; //错误

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

if (student == Bill)
if (student == 2)

还可以使用关系运算符来比较两个枚举变量。例如,以下 if 语句确定存储在 student1 中的值是否小于存储在 student2 中的值:

if (student1 <student2)

如果 student1 等于 Bill,student2 等于 John,则该语句为 true。但是,如果 student1 等于 Bill,而 student2 等于 Sharon,则该语句将为 false。

如前所述,默认情况下,枚举列表中的符号将被赋给整数值 0、1、2 等等。如果这不合适,则可以指定要赋给的值,如以下示例所示:

enum Department { factory = 1, sales = 2, warehouse = 4 };

请记住,如果为枚举符号赋值,则它们必须是整数。以下赋值语句将产生错误:

enum Department { factory = 1.1, sales = 2.2, warehouse = 4,4 }; //错误

虽然没有要求按升序排列赋给的整数值,但一般默认是这样。

如果在赋值时省略了一个或多个符号,则它们将被赋给一个默认值,来看以下 2 个示例:

【示例 1】

enum Colors { red, orange, yellow = 9, green, blue };

在该示例中,命名常量 red 将被赋值为 0,orange 将为 1,yellow 将为 9,green 将为 10,blue 将为 11。

【示例 2】

enum Rooms { livingroom = 1, den, bedroom, kitchen };

在该示例中,livingroom 被赋值为 1,den 将为 2,bedroom 将为 3,kitchen 将为 4。

枚举数据类型的目的之一是符号名称有助于使程序自我解释。但是,由于这些名称不 是字符串,它们仅在程序中使用。在使用 Roster 数据类型的示例中,以下两个语句将输出 一个 2,而不是名称 Sharon:

Roster student1 = Sharon;
cout << student1;

因为枚举数据类型的符号名称与整数值相关联,所以它们可以在 switch 语句中使用,如下面的程序所示,该程序还演示了可以使用枚举的数据类型,而不实际创建该类型的任何变量。

  1. #include <iostream>
  2. using namespace std;
  3. // Declare the enumerated type
  4. enum Roster { Tom = 1, Sharon, Bill, Teresa, John };
  5. // Sharon - John will be assigned default values 2-5.
  6. int main()
  7. {
  8. int who;
  9. cin >> who;
  10. switch (who)
  11. {
  12. case Tom :
  13. cout << "Tom's birthday is January 3.\n";
  14. break;
  15. case Sharon :
  16. cout << "Sharon's birthday is April 22.\n";
  17. break;
  18. case Bill :
  19. cout << "Bill's birthday is December 19.\n";
  20. break;
  21. case Teresa :
  22. cout << "Teresa's birthday is February 2.\n";
  23. break;
  24. case John :
  25. cout << "John's birthday is June 17.\n";
  26. break;
  27. default :
  28. cout << "Invalid selection\n";
  29. }
  30. return 0;
  31. }

程序运行结果:

2
Sharon's birthday is April 22.

c++中的enum类型相关推荐

  1. mysql enum_MySQL数据库中关于ENUM类型的详细解释

    MySQL数据库中,因为工作的需求,我们可能会用到ENUM类型,但是由于此类型不是很常用,我们可能对其也不是很了解.没关系,本文我们就对ENUM类型做一些详细的解释,希望能够对您有所帮助. ENUM类 ...

  2. mql5的include库文件中自定义enum类型在指标文件中的调用方式

    在mql5中编写指标,调用的include文件中某个类中使用了自定义ENUM枚举类型,如图所示: enum Smooth_Method { MODE_SMA_, //SMA MODE_EMA_, // ...

  3. C语言中枚举enum的用法

    本文举例说明C语言中enum枚举关键字的用法. 用来同时定义多个常量 利用enum定义月份的例子如下. #include enum week {Mon=1,Tue,Wed,Thu,Fri,Sat,Su ...

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

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

  5. c语言枚举常量,浅述C语言中枚举enum的用法

    本文举例说明C语言中enum枚举关键字的用法. 用来同时定义多个常量 利用enum定义月份的例子如下. #includeenumweek{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun}; ...

  6. mysql中enum类型

    ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串("") 或 NULL: 如果 ...

  7. MYSQL中 ENUM 类型

    MYSQL中 ENUM 类型的详细解释 ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串(&quo ...

  8. MySQL中的enum和set类型

    文章目录 1 enum类型 2 set类型 1 enum类型 ENUM类型又称为枚举类型.在创建表时,ENUM类型的取值范围以列表的形式指定,其基本形式如下: 属性名 ENUM('值1', '值2', ...

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

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

最新文章

  1. oracle将查询结果声明为伪表,Oracle查询操作(增删改查,伪表,高级查询)实例讲解...
  2. timespan怎么比较大小_装饰画怎么挂都不好看?那是你不懂技巧!整理了一篇攻略,请拿好...
  3. 统计信息自动收集任务失效原因排查
  4. 2019阿里巴巴技术面试题集锦(含答案)
  5. C语言 typedef 和 define 区别 - C语言零基础入门教程
  6. CV新赛事|CT影像诊断新冠肺炎北京垃圾分类识别~文末有福利
  7. ROS入门笔记(十一):编写与测试简单的Service和Client (Python)
  8. 神奇的反爬措施--大众点评
  9. python读取图片转cvs_python将图片转换为csv
  10. PowerDesigner安装教程
  11. PPT(默认设置快捷键的使用)
  12. 32个高效思维模型,快速提升你的思考力!
  13. java教程51_java基础视频教程
  14. 奇想大白话之《羊了个羊》为何火,技术很厉害吗?
  15. 模仿微信九宫格图片展示控件
  16. Android JetPack Security简介
  17. 前端学习记录(三) CSS浮动、定位与居中
  18. 代码规范:规范你我他
  19. 数据治理:元数据及元数据管理策略、方法和技术
  20. maya要学python吗_Day1 为什么要学Python?

热门文章

  1. String 类型切割成数组-转int数组-升列排序-拼接字符串、需求 有如下一个字符串 91 27 46 38 50
  2. EduCoder 机器学习 逻辑回归
  3. CentOS curses 中文乱码问题
  4. 征战蓝桥 —— 2017年第八届 —— C/C++A组第10题——油漆面积
  5. 第六章 定积分的应用 —— 第一节 定积分的元素法
  6. 1037:计算2的幂
  7. 【Linux系统编程】Linux系统调用
  8. php time相差12小时_PHP获取时间比实际时间少8小时的问题
  9. openssl漏洞怎么处理_以太坊UDP流量放大反射DDOS漏洞
  10. go iscoinbase()_《电车GO!驰骋吧山手线》新情报:高分攻略与新模式介绍