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 命令可以说…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
