iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++枚举解读(enum)
  • 583
分享到

C++枚举解读(enum)

c++java数据结构linux开发语言 2023-09-02 06:09:10 583人浏览 独家记忆
摘要

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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

对于开发c++来说,枚举是一个几乎必然用到的功能。当然今天要讲的枚举肯定不是平常漫不经心的使用,而是从里到外地深扒它,逐渐揭开它神秘地面纱,发现一些未曾注意到地东西。


一、枚举是什么?

枚举(enumeration)类型用于存放用户指定的一组整数值(§iso.7.2)。枚举类型的每种取值各自对应一个名字,我们把这些值叫做枚举值(enumerator)。

二、使用步骤

枚举类型分为两种:

  1. enum class,它的枚举值名字位于enum的局部作用域内,枚举值不会隐式地转换成其他类型。
  2. 普通的enum,它的枚举值名字与枚举类型本身位于同一个作用域中,枚举值隐式地转换成整数。

普通枚举和类枚举最显著地差异是“作用域”不同和“隐式类型转换”,接下来我们分开讲。

1.作用域

  1. 枚举类

    枚举名字前面带class修饰符地枚举就是枚举类,它地成员作用域在enum内部,外部是不能直接访问的,需要通过类名::访问。举一个例子:

enum class Lights{red,green,yellow};

你在类外面直接访问red或其它任何元素都是不行的,正确的访问方式是:

Lights::red

和类访问公有成员是一样的。

  1. 普通枚举

普通枚举就是不带class修饰符的枚举,它的枚举值名字与枚举类型本身位于同一个作用域中。不需要通过名字访问,举个例子:

    enum Lights{        red, green,yellow    };

访问方式和类枚举也有显著差别,直接使用枚举值名字就行了。

red//或Lights::red;

和在函数里访问一个局部变量是一样的,不需要显式指定枚举名字,也可以显式指定枚举名字,效果一样的。

  1. 未命名枚举
    还有一种枚举就是既不加class修饰,也不写枚举名字,而是只有枚举值,例如:
enum{red,green,yellow};

这种枚举访问方式和普通枚举一样,就是少了一个枚举名访问方式(因为没有名字,所以没法用名字访问)。

red

2.隐式类型转换

枚举常用一些整数类型表示,每个枚举值是一个整数。如果不显式指定枚举值,那么枚举值是默认从0开始的正整数。这一点对于所有的枚举类型都是一样的。

//枚举类enum class Lights{red,// 0green,// 1yellow// 2};//普通枚举enum Lights{red,// 0green,// 1yellow// 2};//未命名枚举enum {red,// 0green,// 1yellow// 2};

不同的是使用class修饰的枚举类型,它的枚举值是不能隐式转换成其他类型的(这里是int)。比如:

//枚举类int ecl = Lights::red;//这是错误的//普通枚举int el =  Lights::red;//这是正确的//未命名枚举int l = red;//这是正确的

3.显式指定枚举值类型

如果我们不显式指定枚举值类型,那么枚举值默认是带符号或无符号的整型。我们也可以显式指定枚举值类型为char或其他类型,例如:

enum class Lights:int{red,green,yellow};//sizeof(Lights) == 4enum class Lights:char{red,green,yellow};//sizeof(Lights) == 1

4.指定枚举值的值

前面我们知道如果不显式指定枚举值的话,默认是int,而且值是从0开始的依次往后排的。也就是,第一个值是0,第二个是1,第三个是2…

enum class Lights{red = 0,green = 1,yellow = 2};

上面的效果和默认值是一样的。

还有一种方法是可以给枚举值指定负数,比如-1,考虑下面的代码:

enum class Lights{red = -1,green,yellow};

需要注意的是,上面red指定为-1,green没有指定值,那么green就是默认0,yellow就是1,依次递增。
不过这种命名方式多少有点不符合常理了,虽然语法上没有错,编译也不会报错,但是不建议这么用。就维持默认就行了。

4.整形显式转换成枚举

一个整数类型的值可以显式地转换成枚举类型。如果这个值属于枚举的基础类型的取值范围,则转换是有效的;否则,如果超出了合理的表示范围,则转换的结果是未定义的。考虑下面的例子:

    enum class Flag:char {x =1,y =2,z =4,e=8,f=127,g=128};    Flag flag4 = static_cast<Flag>(5);    Flag flag5 = static_cast<Flag>(999);

char的取值范围是-128-127,f=127的值是没问题的,但是g=128的值会引发窄化转换错误,从而导致编译报错。
再看下面的两个,虽然编译器不报错,但是5不是枚举里面的值,这么做失去意义;999严重超过char的取值范围,但是不会触发窄化转换的错误,导致未定义的行为。


总结

  1. 枚举值的默认值是有规律的,如果不能满足你的需求,就自定义值
  2. 建议使用枚举类,副作用比较小。主要是名字空间污染的问题,可能一不小心就会引发其他的问题。

来源地址:https://blog.csdn.net/jiexijihe945/article/details/129300222

--结束END--

本文标题: C++枚举解读(enum)

本文链接: https://www.lsjlt.com/news/390097.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作