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 命令可以说…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...