C++中枚举enum详解

2023-05-16

转载博客地址:https://blog.csdn.net/bruce_0712/article/details/54984371

 

  众所周知,C/C++语言可以使用#define和const创建符号常量,而使用enum工具不仅能够创建符号常量,还能定义新的数据类型,但是必须按照一定的规则进行,下面我们一起看下enum的使用方法。

步骤(一)——枚举量的声明和定义

(1)首先,请看下面的语句:

enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};

这句话有两个作用:

第一:声明enumType为新的数据类型,称为枚举(enumeration);

第二:声明Monday、Tuesday等为符号常量,通常称之为枚举量,其值默认分别为0-6。(后面会介绍怎样显式的初始化枚举量的值)

 

(2)接着利用新的枚举类型enumType声明这种类型的变量:enumType Weekday'就像使用基本变量类型int声明变量一样,如 int a;也可以在定义枚举类型时定义枚举变量enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}Weekday;

然而与基本变量类型不同的地方是,在不进行强制转换的前提下,只能将定义的枚举量赋值给该种枚举的变量,如:Weekday = Monday;或者Weekday = Sunday;不能将其他值赋给枚举变量,如:Weekday = 10;这是不允许的,因为10不是枚举量。也就是说Weekday只能是定义的Monday-Sunday这些定义过的枚举量。然而这不是绝对的,第六条会讲到利用强制类型转换将其他类型值赋给枚举变量

 

(3)上面讲不能将非枚举量赋给枚举变量,那么能不能将枚举量赋给非枚举变量呢?如:int a=Monday;这是允许的,因为枚举量是符号常量,这里的赋值编译器会自动把枚举量转换为int类型。

 

(4)前面讲可以对枚举进行赋值运算,那枚举变量能不能进行算术运算呢?

Weekday++;Weekday = Monday + Tuesday;这是非法的,因为这些操作可能导致违反类型限制,比如:Weekday = Sunday;

Weekday++;Weekday首先被赋予枚举量中的最后一个值Sunday(值为6),再进行递增的话,Weekday增加到7,而对于enumType类型来说,7是无效的。

总结:对于枚举,只定义了赋值运算符,没有为枚举定义算术运算。

 

(5)不能对枚举量进行算术运算,那么枚举量能不能参与其他类型变量的运算呢?int a;a = 1 + Monday;这是允许的,因为编译器会自动把枚举量转换为int类型。

 

(6)第二条讲:在不进行强制转换的前提下,只能将定义的枚举量赋值给该种枚举的变量,言下之意就是可以通过强制转换将其他类型值赋给枚举变量:

Weekday = enumType(2);等同于:Weekday = Wednesday;但是,如果试图将一个超出枚举取值范围的值通过强制转换赋给枚举变量,会出现什么结果?

Weekday = enumType(20);结果将是不确定的,这么做不会出错,但得不到想要的结果。

 

步骤(二)——自定义枚举量的值

(1)前面讲通过定义enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};

枚举量Monday、Tuesday等的值默认分别为0-6,我们可以显式的设置枚举量的值:

enum enumType {Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7};

指定的值必须是整数

(2)也可以只显式的定义一部分枚举量的值:

enum enumType {Monday=1, Tuesday, Wednesday=1, Thursday, Friday, Saturday, Sunday};这样Monday、Wednesday均被定义为1,则Tuesday=2,Thursday、Friday、Saturday、Sunday的值默认分别为2、3、4、5.总结:未被初始化的枚举值的值默认将比其前面的枚举值大1。

(3)第二条还说明另外一个现象,就是枚举量的值可以相同。

 

步骤(三)——枚举的取值范围

前面讲到可以通过强制转换将其他类型值赋给枚举变量:Weekday = enumType(2);这是合法的;但是Weekday = enumType(20);是非法的。这里涉及枚举取值范围的概念:枚举的上限是 大于最大枚举量的 最小的2的幂,减去1;

枚举的下限有两种情况:一、枚举量的最小值不小于0,则枚举下限取0;二、枚举量的最小值小于0,则枚举下限是 小于最小枚举量的 最大的2的幂,加上1。

举例来讲:

假如定义 enum enumType1 { First=-5,Second=14,Third=10 };则枚举的上限是16-1=15(16大于最大枚举量14,且为2的幂);  枚举的下限是-8+1=-7(-8小于最小枚举量-5,且为2的幂);

 

步骤(四)——枚举应用

个人觉得枚举switch是最好的搭档:enum enumType{Step0, Step1, Step2}Step=Step0;//注意这里在声明枚举的时候直接定义了枚举变量Step,并初始化为Step0

switch (Step)

{

  case Step0:{...;break;}

  case Step1:{...;break;}

  case Step2:{...;break;}

  default:break;

}

 

另外枚举还有一种少见的用法是 enum { one ,two ,three};  就是不指定一个名字,这样我们自然也没法去定义一些枚举类型了。此时就相当于static const int one = 0;这样定义三个常量一样。然后用的话就是int no = one。

 

————————————————————————————————————————————————————————

一、简述

  强类型枚举(Strongly-typed enums),号称枚举类型,是C++11中的新语法,用以解决传统C++枚举类型存在的缺陷。传统C++中枚举常量被暴漏在外层作用域中,这样若是同一作用域下有两个不同的枚举类型,但含有相同的枚举常量也是不可的,比如:


enum Side{Right,Left};
enum Thing{Wrong,Right};  

这是不能一起用的。 
  另外一个缺陷是传统枚举值总是被隐式转换为整形,用户无法自定义类型。C++11中的强类型枚举解决了这些问题。

————————————————————————— 

二、强类型枚举

  强类型枚举使用enum class语法来声明,如下:


enum class Enumeration{
 VAL1,
 VAL2,
 VAL3=100,
 VAL4
};  

这样,枚举类型时安全的,枚举值也不会被隐式转换为整数,无法和整数数值比较,比如(Enumeration::VAL4==10会触发编译错误)。

 另外枚举类型所使用的类型默认为int类型,也可指定其他类型,比如:


enum calss Enum:unsigned int{VAL1,VAL2};  

正如前面所说,强类型枚举能解决传统枚举不同枚举类下同枚举值名的问题,使用枚举类型的枚举名时,必须指明所属范围,比如:Enum::VAL1,而单独的VAL1则不再具有意义。

还有一点值得说明的是C++11中枚举类型的前置声明也是可行的,比如:


enum calss Enum;
enum class Enum1:unsigned int;  

————————————————————————— 

三、项目中的强类型枚举代码片段

1、图像处理


enum class Color{RED,BLUE,YELLOR,BLACK,WHITE};  

2.交通灯


enum class TrafficLight{RED,YELLOR,GREEN};  

强类型枚举值具有传统枚举的功能——命名枚举值,同时又具有类的特点——具有类域的成员和无法进行默认的类型转换。所以也称之为枚举类——enmu class

枚举类的底层数据必须是有符号或无符号整型,比如char unsigned int unsigned long,默认为int。

3.前置声明应用


enmu class Clolor:char;  //前置声明枚举类
void Foo(Color*p);        //前置声明的使用
//....................
enum class Color:char{RED,GREEN,BLACK,WHITE};                       //前置声明的定义  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系: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)

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

    目录 一 什么是枚举enum WHAT 二 使用枚举enum的场景 WHEN and WHERE 三 如何使用枚举enum HOW 1 xff09 枚举的定义 2 xff09 枚举的初始化 3 xff09 指定枚举类型 4 声明枚举对象 5
  • Qt Q_ENUM使用 枚举字符串互转

    目录 1 简述2 Q ENUM用法2 1 声明使用2 2 测试例子 3 用模板实现一个字符串枚举互转3 1代码3 2 用法示例 1 简述 数据库里用到了枚举的存储 xff0c 比如一个设备有两个状态 xff0c 保持数据库和代码的可读性 x
  • C语言 -- enum 枚举的使用

    一 枚举的定义 枚举是C语言的一种基本的数据类型 enum 枚举名 枚举元素1 枚举元素2 我们以星期举例 enum DAY MON 61 1 TUE WED THU FRI SAT SUN 如果没有赋值 xff0c 第一个枚举成员的默认值
  • c语言枚举做字符类型转换,C# 枚举类型转换字符串 Enum to string

    c 枚举类型转换字符串 enum to string 枚举类型都是值类型 system enum是一个抽象类 abstract class xff0c 所有枚举类型都直接继承自它 xff0c 当然也同时继承了它的所有成员 所有的值类型都是s
  • C++枚举类型enum使用方法(附带可用代码+通俗易懂)

    1 说明 枚举用来表示某类事情的结果 xff1b 例1 xff1a 下棋比赛的三种结果 xff0c 赢 xff0c 和 xff0c 输 xff1b 这里是描述比赛的结果 例2 xff1a 一周7天中的俩种结果 xff0c 工作日和非工作日
  • 枚举(enum)

    一 什么是枚举 我们学习过单例模式 xff0c 即一个类只有一个实例 而枚举其实就是多例 xff0c 一个类有多个实例 xff0c 但实例的个数不是无穷的 xff0c 是有限个数的 例如word文档的对齐方式有几种 xff1a 左对齐 居中
  • C 语言使用宏自定义可打印的枚举(enum) 类型

    1 前言 xff1a 说点废话 xff0c 时间紧的请直接跳过 xff0c 看后面的实现 尽管本人很反感 C 语言中的宏定义 xff0c 特别是滥用宏定义经常会让问题变的扑朔迷离 xff0c 但是不得不承认 xff0c 在某些时候 xff0
  • C#语法小知识(三)枚举类型enum

    枚举类型声明一系列常数 xff0c 用于表示这个类型的变量可能会在这些常数里变化 我们在这篇文章里讲一下枚举类型的几个用法 一个简单的枚举类型的定义 xff1a enum TestEnum x y z 而使用也很简单 xff1a TestE
  • 推荐一个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 可以增加
  • C++枚举解读(enum)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 枚举是什么 xff1f 二 使用步骤1 作用域2 隐式类型转换3 显式指定枚举值类型4 指定枚举值的值4 整形显式转换成
  • enum枚举类型作为成员变量

    Enum是枚举类型 定义形式一 xff1a Enum 枚举类型名 枚举常量1 xff08 61 0 xff09 xff0c 枚举常量2 xff08 61 0 xff09 xff0c 枚举变量1 xff08 xff0c 枚举变量2 xff0c
  • Java枚举的使用

    枚举类型可以取代以往常量的定义方式 即将常量封装在类或接口中 此外 枚举类型还提供了安全检查功能 枚举类型本质上还是以类的形式存在 1 使用枚举类型设置常量 以往设置常量 通常将常量放置在接口中 这样在程序中就可以直接使用了 并且该常量不能
  • java枚举的集中管理

    java枚举的集中管理 一 产品中遇到的实际情况 枚举类泛滥 这个 这个 这个 这个 在 JDK 1 5 之前没有枚举类型 那时候一般用接口常量来替代 而使用 Java 枚举类型 enum 可以更贴近地表示这种常量 但是在项目中 就变成这样
  • 枚举类中通过code值获取对应的desc值

    Getter NoArgsConstructor public enum TaskRecordTypeEnum STOPTASK 0 禁用任务 STARTTASK 1 启用任务 private int code private String
  • Java,Enum里定义属性和方法

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

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

    在实际应用中 有的变量只有几种可能取值 如人的性别只有两种可能取值 星期只有七种可能取值 在 Java语言中对这样取值比较特殊的变量可以定义为枚举类型 所谓枚举是指将变量的值一一列举出来 变量只限于列举出来的值的范围内取值 枚举是一个特殊的

随机推荐