转自: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》

C++ 关键字 enum的更多相关文章

  1. eclipse 遇关键字enum编译问题解决

    今天公司系统升级 JDK1.4 到 JDK1.5, 结果工程在eclipse中编译不能通过: Enumeration enum = ………… 但是eclipse报错: Multiple markers ...

  2. 关于java 关键字enum不识别的解决办法

    从别人那儿拷贝过来的myeclipse java工程,打开一看标红了一大片,仔细一看,原来是不识别enum关键字,这就有点尴尬了. 我自己重新建了一个java工程,测试了下,假如我在新建工程的时候选择 ...

  3. Java分享笔记:自定义枚举类 & 使用enum关键字定义枚举类

    在JDK1.5之前没有enum关键字,如果想使用枚举类,程序员需要根据Java语言的规则自行设计.从JDK1.5开始,Java语言添加了enum关键字,可以通过该关键字方便地定义枚举类.这种枚举类有自 ...

  4. iOS 开发-- enum与typeof enum用法

    一, 两者的用法 枚举类型定义用关键字enum标识,形式为: enum标识符 { 枚举数据表 }; enum用来定义一系列宏定义常量区别用,相当于一系列的#define ** **,当然它后面的标识符 ...

  5. 枚举类型Enum

    包java.dataStructure中,文件名Enum_demo.java 在JDK5中引入了一个新的关键字——enum,可以直接定义枚举类型 在申明枚举类的时候,也可以申明属性.方法和构造函数,但 ...

  6. enum与typedef enum的用法

    一,两者的用法 枚举类型定义用关键字enum标识,形式为: enum 标识符 { 枚举数据表 }:枚举数据(枚举常量)是一些特定的标识符,标识符代表什么含义,完全由程序员决定.数据枚举的顺序规定了枚举 ...

  7. c enum用法

    c语言中enum的用法,先用关键字enum声明一个类型如enum HUMAN {MAN ,WOMAN};这里就声明了一个HUMAN这个枚举类型.其中MAN的值为0,后面依次递增.后面要用的时候,先声明 ...

  8. C#中的枚举类型(enum type)

    ylbtech 原文 C#中的枚举类型(enum type) 概念 枚举类型(enum type)是具有一组命名常量的独特的值类型.在以下示例中: enum Color { Red, Green, B ...

  9. java之enum枚举(2015年05月28日)

    背景: 今天启动了一个新的项目,由于要从之前的旧项目中拿过来一些代码,所以就看了下公司之前项目代码,发现有定义的常量类,也有枚举类,然后就在想着两者的功能差不多,那他们之间到底有什么区别呢,所以就决定 ...

随机推荐

  1. 【Spring注解驱动开发】AOP核心类解析,这是最全的一篇了!!

    写在前面 昨天二狗子让我给他讲@EnableAspectJAutoProxy注解,讲到AnnotationAwareAspectJAutoProxyCreator类的源码时,二狗子消化不了了.这不,今 ...

  2. 对于分布式Job的思考

    引言 在清理Github的时候,发现以前写的一个简单的分布式任务分发系统ClawHub/task-distribution,使用了zk的选主与队列,调度器使用spring的ThreadPoolTask ...

  3. Resis常用命令及数据类型

    1.下载Windows环境redis安装: 2.下载jar包: commons-pool2-2.4.2.jar jedis-2.9.0.jar 3.项目结构: 4.代码说明: package com. ...

  4. directives 自定义指令

    钩子函数 一个指令定义对象可以提供如下几个钩子函数 (均为可选): bind:只调用一次,指令第一次绑定到元素时调用.在这里可以进行一次性的初始化设置.基本数据类型如果发生改变,不会触发,但是引用数据 ...

  5. Spring security OAuth2.0认证授权学习第四天(SpringBoot集成)

    基础的授权其实只有两行代码就不单独写一个篇章了; 这两行就是上一章demo的权限判断; 集成SpringBoot SpringBoot介绍 这个篇章主要是讲SpringSecurity的,Spring ...

  6. sqlserver语句的执行顺序

    执行顺序: 1.from 2.where 3.group by 4.having 5.根据select 关键之后的要显示的字段,进行结果集显示 6.order by 对最终结果集进行排序 7.top/ ...

  7. Git 实用基础(配置,建库,提交,推送 GitHub)

    Git 实用基础(配置,建库,提交,推送 GitHub) SVN ? Git ? 目前市面上主流的版本控制系统就是 SVN 和 Git . 两者的区别简单通俗地说就是,版本数据是否有在本地. 如果觉得 ...

  8. 《Linux 操作系统》Linux的常用命令操作大全

    前言 在学习命令之前先学习我们该如何去学习linux 命令. 几乎每一个命令都有参数,每个参数的含义是什么,我们一般也不是全部都能记住,所以我们必须有一个可以知道每一个命令下各个参数的含义的方法. 命 ...

  9. JS -- 基础语法1

    一.document.write() 输出内容 document.write() 可用于直接在网页中输出内容. 方式1:输出内容用""括起,直接输出""号内的内 ...

  10. USB 设备驱动(写给自己看的)

    集线器与控制器(USB地址7bit) 设备,配置,端点,接口 USB1.0(低速1.2),1.1(全速450m),2.0(高速,电流传输)区别 引脚4根(V,D-,D+,gnd),miniUSB增加 ...