C++ 之枚举类型
文章目录
- 参考
- 描述
- 枚举类型
- 枚举类型
- 枚举变量的声明及定义
- 细节
- 枚举常量的默认初始值
- 枚举常量不可被修改
- 赋值
- 运算
- 枚举常量与数据类型
- 为枚举常量指定数据类型
- 可选择的数据类型
- 特殊的 Bool
- 强枚举类型
- 命名冲突
- 强枚举类型
参考
| 项目 | 描述 |
|---|---|
| 菜鸟教程 | C++ 枚举类型详解 |
| 精通C++ (第九版) | 托尼·加迪斯、朱迪·沃尔特斯、戈德弗雷·穆甘达 (著) / 黄刚 等 (译) |
| 搜索引擎 | Bing |
描述
| 项目 | 描述 |
|---|---|
| 操作系统 | Windows 10 专业版(64位) |
| g++ | 8.1.0 |
枚举类型
枚举类型
在 C++ 中,如果一个变量的可能取值为有限个时,你可以使用枚举类型对该变量进行声明。枚举类型是枚举常量的集合,枚举常量即是使用该枚举类型声明的枚举变量所能取得的值。枚举类型并不能为你提供太多的帮助,但能有效地提高程序的可读性及可靠性(安全性)。
-
可读性
枚举常量均使用标识符指代常量(也称字面量,直接在程序中出现的数据),这比在程序中直接给出数据更具有可读性(见名知意)。 -
可靠性
使用常量而不是变量(变量在初始化后能够更改,而常量在初始化后不可更改),可以有效防止数据被有意或无意的更改,提高程序的可靠性。
举个栗子
#include <iostream>
using namespace std;int main(){// 定义一个枚举类型 Weekenum Week{// 为枚举常量赋予初始值SUNDAY = 0,MONDAY = 1,TUESDAY = 2,WEDNESDAY = 3,THURSDAY = 4,FRIDAY = 5,SATURDAY = 6}; // 请注意此处的分号,若是缺少该分号,C++ 将抛出错误// 使用枚举类型 Week 定义一个枚举变量Week today;// 为枚举变量指定一个枚举常量today = SUNDAY;// 将 today 中保存的值输出到执行窗口中cout << today << endl;// 修改枚举变量的值today = WEDNESDAY;// 将 today 中保存的值输出到执行窗口中cout << today << endl;// 暂停执行窗口的执行system("pause");
}
执行结果
0
3
请按任意键继续. . .
其中:
- 枚举类型使用关键字 enum 进行定义。
- 枚举类型的名称建议使用大驼峰式命名法(也称帕斯卡命名法)进行命名,而使用枚举类型声明的枚举变量则建议使用小驼峰式命名法进行命名。
枚举变量的声明及定义
在声明枚举类型的同时,你可以声明一个或多个枚举变量。对此,请参考如下示例:
#include <iostream>
using namespace std;int main(){enum Week{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}today, tomorrow; today = WEDNESDAY;tomorrow = THURSDAY;cout << today << endl;cout << tomorrow << endl;system("pause");
}
执行结果
3
4
请按任意键继续. . .
除了在定义枚举类型的同时声明一个或多个枚举变量外,你还可以在这个过程中初始化枚举变量。对此,请参考如下示例:
#include <iostream>
using namespace std;int main(){enum Week{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}today, tomorrow; today = WEDNESDAY;tomorrow = THURSDAY;cout << today << endl;cout << tomorrow << endl;system("pause");
}
执行结果
3
4
请按任意键继续. . .
细节
枚举常量的默认初始值
在定义一个枚举类型时,你可以不为枚举常量赋予初始值。C++ 将依据枚举常量声明的顺序为每一个枚举常量赋予一个大于或等于 零 的整数。对此,请参考如下示例:
#include <iostream>
using namespace std;int main(){// 定义一个枚举类型 Weekenum Week{// 不为枚举常量赋予初始值SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; cout << "Sunday\t\t" << SUNDAY << endl;cout << "Monday\t\t" << MONDAY << endl;cout << "Tuesday\t\t" << TUESDAY << endl;cout << "Wednesday\t" << WEDNESDAY << endl;cout << "Thursday\t" << THURSDAY << endl;cout << "Friday\t\t" << FRIDAY << endl;cout << "Saturday\t" << SATURDAY << endl;system("pause");
}
执行结果
Sunday 0
Monday 1
Tuesday 2
Wednesday 3
Thursday 4
Friday 5
Saturday 6
请按任意键继续. . .
当然,你也可以仅对其中部分枚举常量赋予初始值。其它未被人为指定初始值的枚举常量将按照类似的规则由 C++ 赋予初始值。对此,请参考如下示例:
#include <iostream>
using namespace std;int main(){enum Week{SUNDAY, MONDAY = 9, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; cout << "Sunday\t\t" << SUNDAY << endl;cout << "Tuesday\t\t" << TUESDAY << endl;cout << "Wednesday\t" << WEDNESDAY << endl;system("pause");
}
执行效果
Sunday 0
Tuesday 10
Wednesday 11
请按任意键继续. . .
枚举常量不可被修改
在为枚举常量赋予初始值后,不可修改枚举常量的值。否则,C++ 将抛出错误。
赋值
虽然枚举常量在内存中是以整数的形式存储的,但你不能将整数直接赋予枚举变量。这将引发错误。例如,如下代码将抛出错误。
#include <iostream>
using namespace std;int main(){enum Week{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; Week today = SUNDAY;cout << today << endl;// 下一行语句将引发错误Week tomorrow = 1;cout << tomorrow << endl;system("pause");
}
虽然,不能将整数直接赋予枚举变量,但你可以将枚举常量赋予整型等数据类型所声明的变量或常量。对此,请参考如下示例:
#include <iostream>
using namespace std;int main(){enum Week{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; int num = WEDNESDAY;const float num_f = SATURDAY;cout << num << endl;cout << num_f << endl;system("pause");
}
执行效果
3
6
请按任意键继续. . .
运算
枚举常量能够与其它类型的常量(字面量)发生运算,但将结果赋予枚举变量前需要将结果值转换为枚举变量所属的枚举类型。对此,请参考如下示例:
#include <iostream>
using namespace std;int main(){enum Week{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; // 枚举变量不可接收其它类型的数据。因此,我们需要// 将 SUNDAY + 8 的结果转换为 Week 类型的数据。// 否则,C++ 将抛出错误。Week freedom = (Week)(SUNDAY + 8);cout << freedom << endl;system("pause");
}
执行结果
8
请按任意键继续. . .
枚举常量与数据类型
枚举常量的默认数据类型为 int,我们可以通过如下示例对其加以验证:
#include <iostream>
using namespace std;int main(){enum Week{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; // 输出枚举类型 Week 所占用的内存空间,即单个// 枚举产量所占用的内存空间。cout << sizeof(Week) << endl;system("pause");
}
执行结果
由输出结果可以判断出:
在默认情况下单个枚举常量所占用的内存空间为 四个字节,与整型 int 所占用的内存空间相同。
4
请按任意键继续. . .
为枚举常量指定数据类型
在定义枚举类型时,你可以使用符号 : 来指定枚举常量所使用的数据类型。比如,使用数据类型 char 作为枚举常量的数据类型。对此,请参考如下示例:
#include <iostream>
using namespace std;int main(){// 使用数据类型 char 作为枚举常量的数据类型 enum Week:char{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; // 将枚举常量 TUESDAY 所保存的值输出到执行窗口中cout << TUESDAY << endl;// 将枚举类型 Week 所占用的内存空间输出到执行窗口中cout << sizeof(Week) << endl;system("pause");
}
执行结果
2
1
请按任意键继续. . .
可选择的数据类型
你可以选择使用如下数据类型作为枚举常量使用的数据类型:
- Bool(布尔型)
- Int(有符号型、无符号型)
- Short(有符号型、无符号型)
- Long Long(有符号型、无符号型)
- Long(有符号型、无符号型)
- Char(字符型)
特殊的 Bool
在将数据类型 Bool 作为枚举常量的数据类型时,需要注意以下两点:
- 枚举常量的值仅能为 0 或 1。否则,C++ 将抛出错误。
- 未被人为指定初始值的枚举常量最多为两个(超出两个的话,必有一个枚举常量将被赋予大于 1 的整数)。否则,C++ 将抛出错误。
强枚举类型
命名冲突
C++ 不允许相同作用域内的多个枚举量具有相同的名称,也就是说,在同一作用域内,即使是两个不同的枚举数据类型,也不能定义或使用相同的枚举量名称作为自己的成员。
由于该规则,以下代码在执行过程中将引发错误。
#include <iostream>
using namespace std;int main(){enum Week{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; enum Weekend{// 在同一作用域中使用相同的名称作为// 枚举常量的标识符。SUNDAY, SATURDAY};system("pause");
}
倘若你在不同作用域中使用相同的名称作为枚举常量的标识符将不会引发错误。对此,请参考如下示例:
#include <iostream>
using namespace std;// 在不同作用域中使用相同的名称作为枚举常量的
// 标识符将不会引发错误。
enum Weekend
{SUNDAY, SATURDAY
};int main(){enum Week{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; system("pause");
}
强枚举类型
在 C++ 11 版本中,官方添加了一个新的类型,即强枚举类型。通过强枚举类型,你将能够避免命名冲突的发生。对此,请参考如下示例:
#include <iostream>
using namespace std;int main(){// 定义强枚举类型 Weekenum class Week{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; // 定义强枚举类型 Weekendenum class Weekend{SUNDAY, SATURDAY};// 使用作用域解析运算符 :: 指定枚举常量所在的作用域Week today = Week::FRIDAY;Weekend tomorrow = Weekend::SATURDAY;// 在将强枚举变量输出的执行窗口前需要先将其转换为 << // 运算符能够识别的数据类型。否则,C++ 将抛出错误。cout << "today\t\t" << (int)today << endl;cout << "tomorrow\t" << (int)tomorrow << endl;system("pause");
}
执行效果
today 5
tomorrow 1
请按任意键继续. . .
注:
强枚举类型仅被 C++ 11 及以上版本所支持。
相关文章:
C++ 之枚举类型
文章目录参考描述枚举类型枚举类型枚举变量的声明及定义细节枚举常量的默认初始值枚举常量不可被修改赋值运算枚举常量与数据类型为枚举常量指定数据类型可选择的数据类型特殊的 Bool强枚举类型命名冲突强枚举类型参考 项目描述菜鸟教程C 枚举类型详解精通C (第九版…...
软件测试用例(3)
按照测试对象划分: 一)界面测试: 1)软件只是一种工具,软件和人的信息交流是通过界面来进行的,界面是软件和用户交流的最直接的一层,界面的设计决定了用户对于我们设计软件的第一映像,界面如同人的面孔,具有最吸引用户的…...
Spring——Bean管理-注解方式进行属性注入
Spring针对Bean管理中创建对象提供的注解有哪些?Component:普通Service:业务逻辑层Controller:controller层Repository:dao层用注解的方式是为什么?简化xml方式开发,只需要注解就可以完成在配置…...
【设计模式之美 设计原则与思想:设计原则】20 | 理论六:我为何说KISS、YAGNI原则看似简单,却经常被用错?
上几节课中,我们学习了经典的 SOLID 原则。今天,我们讲两个设计原则:KISS 原则和 YAGNI 原则。其中,KISS 原则比较经典,耳熟能详,但 YAGNI 你可能没怎么听过,不过它理解起来也不难。 理解这两个…...
Java代码弱点与修复之——Copy-paste error(复制粘贴错误)
弱点描述 Copy-paste error,复制粘贴错误。 是指在复制和粘贴代码时产生的错误。这种错误通常是由于程序员在复制代码时未正确编辑所复制的代码或编辑复制后的代码时忘记更改一些值或参数而导致的。复制粘贴错误可能会导致程序逻辑错误、编译错误或运行时错误。 示例代码 …...
Editor.md 的使用方法及图片处理
目录1. 资源下载2. 生成页面2.1 编辑和预览页面2.2 文本渲染页面3. 图片上传3.1 前端配置3.2 后端接口4. 图片粘贴[^2]1. 资源下载 官网下载 gitee 下载 2. 生成页面 2.1 编辑和预览页面 将资源(精简后 Editor.md 资源1)导入项目: 按照官…...
剑指 Offer II 018. 有效的回文
题目链接 剑指 Offer II 018. 有效的回文 easy 题目描述 给定一个字符串 s,验证 s是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。 本题中,将空字符串定义为有效的 回文串 。 示例 1: 输入: s “A man, a plan, …...
Elasticsearch分析器(Analyzer)
Elasticsearch分析器(Analyzer) 文章目录Elasticsearch分析器(Analyzer)分析器概念内置分析器(8.6版本)自定义分析器elasticsearch-analysis-ik(简称ik,💕14.8kÿ…...
P6入门:了解P6 Professional 工具栏及地图分享
目录 引言 相关分享 引言 凭借更大的灵活性和增强的自定义功能,最新版本的 Oracle Primavera P6 Professional 的界面比早期版本有了巨大改进。对于有经验的伙伴来说,它仍然是熟悉的领域,几乎所有预期的功能都显示在前面。该界面可以更好地…...
习题30 if elif else 语句
people 30#变量people赋值30 cars 40#变量cars赋值40 buses 15#变量buses赋值 if cars > people:#如果出租车比人多print("We should take the cars")#我们坐出租车 elif cars < people:#elif后面必须跟条件,print("We should not take the…...
32 openEuler使用LVM管理硬盘-管理卷组
文章目录32 openEuler使用LVM管理硬盘-管理卷组32.1 创建卷组32.2 查看卷组32.3 修改卷组属性32.4 扩展卷组32.5 收缩卷组32.6 删除卷组32 openEuler使用LVM管理硬盘-管理卷组 32.1 创建卷组 可在root权限下通过vgcreate命令创建卷组。 vgcreate [option] vgname pvname ...…...
Jackson CVE-2017-17485 反序列化漏洞
0x00 前言 同CVE-2017-15095一样,是CVE-2017-7525黑名单绕过的漏洞,主要还是看一下绕过的调用链利用方式。 可以先看: Jackson 反序列化漏洞原理 或者直接看总结也可以: Jackson总结 涉及版本:2.8.10和2.9.x至2.…...
十大排序(C++版)
测试排序的题目: 912. 排序数组 - 力扣(LeetCode) 堕落的做法: class Solution { public:vector<int> sortArray(vector<int>& nums) {sort(nums.begin(),nums.end());return nums;} };视频推荐: …...
SpringMVC中的常用注解
Java知识点总结:想看的可以从这里进入 目录3.2、常用的注解3.2、常用的注解 Controller:代表此类是一个控制器,需要配置包的扫描。Spring MVC 是通过组件扫描机制查找应用中的控制器类的 在Spring6.0之后要求控制层必须添加该注解才会被识别成…...
English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一
English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一课前活动练习方法大小元音总结小元音准备工作[ʌ] 中元音发音技巧对应单词的发音对应句子的发音常见的字母组合[ɒ] 后元音发音技巧对应单词的发音对应句子的发音常见的字母组合…...
fastadmin后台登录页修改
直接替换就行 <!DOCTYPE html> <html lang"{$config.language}"> <head>{include file"common/meta" /}<style type"text/css">body {color: #999;background-color: #f1f4fd;background-size: cover;}a {color: #444;…...
Java 面向对象(OOP)的三大特性
封装 所谓封装,意思就是隐藏内部细节,在编程中,指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,并尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。…...
Java:openjdk: error: Student is abstract; cannot be instantiated;java编译环境
文章目录编译环境jdkopenjdk错误代码小心javac -verbos编译环境 jdk 需要安装的javac 在java-devel 包里 [root10 ~]# rpm -qf /usr/bin/javac file /usr/bin/javac is not owned by any package [root10 ~]# ll /usr/bin/javac lrwxrwxrwx. 1 root root 23 Jun 15 09:52 /us…...
28个案例问题分析---019---临时解决方案和最终解决方案--思想
临时解决方案与最终解决方案一:背景介绍二:临时解决方案?最终解决方案?概念如何选择三:总结一:背景介绍 项目中,出现了一个线上问题。 用户登陆之后看不到课程。重新登陆就可以看到课程。出现这…...
计算机网络的166个概念你知道几个 第四部分
HTML:HTML 称为超文本标记语言,是一种标识性的语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的 Internet 资源连接为一个逻辑整体。HTML 文本是由 HTML 命令组成的描述性文本,HTML 命令可以说…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
