【C++】枚举类型
枚举类型(enumeration)使我们可以将一组整形常量组织在一起。和类一样,每个枚举类型定义了一种新的类型。枚举属于字面值常量类型。
C++包括两种枚举:限定作用域的和不限定作用域的。C++11新标准引入了限定作用域的枚举类型(scoped enumeration)。定义限定作用域的枚举类型的一般形式是:首先是关键字enum class(或者等价地使用enum struct),随后是枚举类型名字以及用花括号括起来的以逗号分隔的枚举成员(enumerator)列表,最后是一个分号:
enum class open_modes {input, output, append};
我们定义了一个名为open_modes的枚举类型,它包含三个枚举成员:input、output和append。
定义不限定作用域的枚举类型(unscoped enumeration)时省略关键字class(或struct),枚举类型的名字是可选的:
enum color {red, yellow, green}; //不限定作用域的枚举类型 //未命名的、不限定作用域的枚举类型 enum {floatPrec = 6, doublePrec = 10, double_doublePrec = 10};
如果enum是未命名的,则我们只能在定义该enum时定义它的对象。和类的定义类似,我们需要在enum定义的右侧花括号和最后的分号之间提供逗号分隔的声明列表。
枚举成员
在限定作用的枚举类型中,枚举类型的名字遵循常规的作用域准则,并且在枚举类型的作用域之外是不可访问的。与之相反,在不限定作用域的枚举类型中,枚举成员的作用域与枚举类型本身的作用域相同:
enum color {red, yellow, green}; //不限定作用域的枚举类型 enum stoplight {red, yellow, green}; //错误:重复定义了枚举成员 enum class peppers {red, yellow, green}; //正确:枚举成员被隐藏了 color eyes = green; //正确:不限定作用域的枚举类型的枚举成员位于有效的作用域中 peppers p = green; //错误:peppers的枚举成员不在有效的作用域中 //color::green在有效的作用域中,但是类型错误 color hair = color::red; //正确:允许显示地访问枚举成员 peppers p2 = peppers::red; //正确:使用peppers的red
默认情况下,枚举值从0开始,依次加1。不过我们也能一个或几个枚举成员指定专门的值:
enum class intTypes { charTyp = 8, shortTyp = 16, intTyp = 16, longTyp = 32, long_longTyp = 64 };
由枚举成员intTyp和shortTyp可知,枚举值不一定唯一。如果我们没有显示地提供初始值,则当前枚举成员的值等于之前枚举成员的值加1。
枚举成员是const,因此在初始化枚举成员时提供的初始值必须是常量表达式。也就是说,每个枚举成员本身就是一条常量表达式,我们可以在任何需要常量表达式的地方使用枚举成员。例如,我们可以定义枚举类型的constexpr变量:
constexpr intTypes charbits = intTypes::charTyp;
类似的,我们也可以将一个enum作为switch语句的表达式,而将枚举值作为case标签。出于同样的原因,我们还能将枚举类型作为一个非类型模板形参使用:或者在类的定义中初始化枚举类型的静态数据成员。
和类一样,枚举也定义新的类型
只要enum有名字,我们就能定义并初始化该类型的成员。要想初始化enum对象或者为enum对象赋值,必须使用该类型的一个枚举成员或者该类型的另一个对象:
open_modes om = 2; //错误:2不属于open_modes om = open_modes::input; //正确:input是open_modes的一个枚举成员
一个不限定作用域的枚举类型的对象或枚举成员自动地转换成整形。因此我们可以在任何需要整型值的地方使用它们:
int i = color::red; //正确:不限定作用域的枚举类型的枚举成员隐式地转换成int int j = peppers::red; //错误:限定作用域的枚举类型不会进行隐式转换
指定enum的大小
尽管enum都定义了唯一的类型
原文地址:https://www.cnblogs.com/bootblack/p/11465948.html
- 如何在CDH中使用HBase快照
- 中间件安全-Tomcat安全测试概要
- 如何在CDH集群使用HDFS快照
- Sentry赋予server1权限给hive以外用户时ACL不同步问题分析
- 如何使用Java连接Kerberos的HBase
- 香香的xss小记录(一)
- UAF Writeup - pwnable.kr
- 如何使用Nginx实现Impala负载均衡
- pwnhub年前最后一战——“血月归来”writeup
- MHN中心服务器搭建与树莓派蜜罐部署
- 如何在CDH中启用Spark Thrift
- 让你的以太坊 DApps 盈利的 6 种方法
- 赛博地球杯初赛第三名,ChaMd5安全团队的writeup
- 如何在Windows Server2012搭建DNS服务并配置泛域名解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Yii框架响应组件用法实例分析
- Android开发学习实现简单计算器
- Android Studio finish()方法的使用与解决app点击“返回”(直接退出)
- Android 8.1隐藏状态栏图标的实例代码
- Android制作登录页面并且记住账号密码功能的实现代码
- Yii框架分页技术实例分析
- PHP命名空间与自动加载机制的基础介绍
- Flutter下Android Studio配置gradle的方法
- Flutter 实现整个App变为灰色的方法示例
- Android studio开发小型对话机器人app(实例代码)
- php中的钩子理解及应用实例分析
- AndroidX下使用Activity和Fragment的变化详解
- PHP Primary script unknown 解决方法总结
- PHP如何将图片文件上传到另外一台服务器上
- android实现滑动解锁