转自:https://blog.csdn.net/cppwork/article/details/18814315

C++ 关键字 enum。 枚举

1.  概念

我们经常需要为某些属性定义一组可选择的值,例如:颜色(赤橙黄绿青蓝紫)、性别(男女)、星期(一二三四五六七),这些属性的值是能够被一一列举出来的,通常用常量值关联的方法来记录这些属性组的值,我们可能会这样编写代码:

const int male = 0;

const int female = 1;

虽然这种方法也能奏效,但是它有个明显的缺点:没有指出这些值是相关联的。枚举提供了一种替代的方法,不但定义了整数常量集,而且还把它们聚集成组。如果一个变量只有几种可能的值,则可以定义为枚举(enumeration)类型,所谓“枚举”就是指把可能的值一一列举出来,变量的值只能限于列举出来的值得范围内。

2.  使用

定义和初始化枚举:枚举的定义包括关键字enum,其后是一个可选的枚举类型名,和一个用花括号括起来、用逗号分开的枚举成员列表。

#include <iostream>
using namespace std; enum Weekday
{
sun, //0
mon, //1
tue, //2
wed, //3
thu, //4
fri, //5
sat //6
}; int main()
{
Weekday day = tue; switch(day)
{
case mon:
case tue:
case wed:
case thu:
case fri:
{
cout<<"Go to work!"<<endl;
}
break;
case sat:
case sun:
{
cout<<"Entertainment!"<<endl;
}
break;
} return 0;
}

枚举名是可选的,所以也可以不声明有名字的枚举类型,而直接定义枚举变量,例如:

enum { sun, mon, tue, wed, thu, fri, sat } workday,weekend;

默认地,第一个枚举成员赋值为 0,后面的每个枚举成员赋的值比前面的大 1。也可以为一个或多个枚举成员提供初始值,但用来初始化枚举成员的值必须是一个常量表达式。例如,可以定义下列枚举类型:

// shape is 1, sphere is 2, cylinder is 3, polygon is 4
enum Forms
{
shape = 1,
sphere,
cylinder,
polygon
};

在 枚举类型 Forms 中,显式将 shape 赋值为 1,其他枚举成员隐式初始化:sphere 初始化为 2,cylinder 初始化为 3,polygon 初始化为 4。 枚举成员值可以是不唯一的:

// point2d is 2, point2w is 3, point3d is 3, point3w is 4
enum Points
{
point2d = 2,
point2w,
point3d = 3,
point3w
};

上面的代码中,枚举成员 point2d 显式初始化为 2,下一个枚举成员 point2w 默认初始化,即它的值比前一枚举成员的值大 1,因此 point2w 初始化为 3,枚举成员 point3d 显式初始化为 3,一样,point3w 默认初始化,结果为 4。

每个 enum 都定义了一种新的类型。和其他类型一样,可以定义和初始化枚举类型的对象,也可以以不同的方式使用这些对象。枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行:

     Points pt3d = point3d; //  ok: point3d is a Points enumerator
Points pt2w = 3; // error: pt2w initialized with int
pt2w = polygon; // error: polygon is not a Points enumerator
pt2w = pt3d; // ok: both are objects of Points enum type

注意把 3 赋给 Points 对象是非法的,即使 3 与一个 Points 枚举成员相关联

3.  枚举大小

对于枚举大小,通常枚举和 int 的大小是一样的:

sizeof(Weekday) == sizeof(day) == sizeof(int)

但是枚举的大小也不一定就和 int 一样,详细可参看 C++标准文档(ISO14882) 中对于枚举的描述

本文参考书目:《C++ Primer》

最新文章

  1. asp.net 数据绑定 -- 时间格式
  2. 用HttpSessionListener与HttpSessionBindingListener实现在线人数统计
  3. 网页音乐突破金币(RMB)下载限制
  4. File Checksum Integrity Verifier
  5. javaScript入门2--基本概念
  6. c#之时间戳与DateTime的相互转换
  7. Java Integer封装类的IntegerCache内部类
  8. python实现简单tftp(基于udp)
  9. Linux 常用命令介绍
  10. 乡下人重拾MVC——@RenderBody @RenderSection @Html.Partial @Html.Action @Html.RenderPartial @Html.RenderAction
  11. 第二十五篇-Android 应用资源
  12. 记一次 mysql 启动没反应
  13. EF使用MySql DBFirst产品的问题总结
  14. Linux 下如何处理包含空格和特殊字符的文件名
  15. C# 正则表达式入门
  16. git忽略相应文件夹,不上传
  17. Java Monitoring&amp;Troubleshooting Tools
  18. [Vuejs+php] MySQL数据转JSON传值到前端
  19. JSONObject与JSONArray
  20. 转载----开发运维资产管理系统cmdb一些观点扯淡

热门文章

  1. Sql 注入----学习笔记2
  2. 【学习中】Fitness Schedule
  3. vue-cli3项目配置eslint代码规范
  4. spring cloud 通过zuul网关去请求的时候报404的几个原因。
  5. PHP生成二维码 endroid/qr-code 扩展包
  6. Python数据类型方法整理
  7. UI中列表
  8. ef6 code first,对已有数据库如何执行迁移
  9. Hadoop入门学习整理(三)
  10. Kafka 【入门一篇文章就够了】