🥥枚举类型
2022-5-15
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

 
枚举(enumerations)可以将整数常量集合起来管理。与类一样,每个枚举定义一个新的类型。类是字面类型(literal types)。
C++支持两个枚举:带作用域的(scoped)和无作用域的(unscoped),新标准引入了带作用域的枚举(scoped enumerations)。
 
定义带作用域的枚举使用enum class或者enum struct关键字,后面跟着枚举名字和逗号分隔的一系列枚举值:
如果省略掉classstruct关键字就是无作用域枚举,在无作用域enum中,枚举名字是可选的:
如果枚举是没有名字的,那么只能在枚举定义处定义其类型的对象,即在结束的括号处添加逗号分隔的声明列表。
 

枚举值(Enumerators)

在带作用域的枚举中的枚举值的名字需要按照正常的作用域规则进行,并且在枚举作用域之外是不可访问的。无作用域枚举的枚举值放在了与枚举自身相同的作用域中。如:
默认情况下,枚举值从0开始,每个枚举值都比之前的那个大1 ,可以给一个或多个枚举值提供初始值:
枚举值的值不需要是唯一的,shortTypeintType的值就是一样的。如果省略初始值,则其值比之前的枚举值多1。枚举值是常量,如果进行初始化,初始值必须是常量表达式。结果就是枚举值自己也是常量表达式,因而可以用于需要常量表达式的场景:
同样可以将枚举用于switch语句中,枚举值可以作为case标签。可以将枚举类型作为非类型模板参数,可以在类定义中初始化枚举类型的静态数据成员。
 
 

枚举定义新的类型

只要枚举是由名字的,就可以定义和初始化这个类型的对象。枚举对象只能由其中一个枚举值或者相同枚举的另外一个对象初始化:
无作用域的枚举的枚举值及其对象可以自动转为整型值,所以它们可以用于任何需要整数值的场景:
 

指定enum 的大小

如果没有指定枚举值的类型,对于有作用域的枚举来说就是 int 类型,对于无作用域的枚举来说就是足够容纳所有的枚举值的。如果指定了枚举值的类型,那么超出范围将会编译失败。这种方式将保证程序的行为在跨系统时都是一致的。如:
 

枚举的前置声明

在新标准下,可以前置声明枚举。枚举的前置声明必须指定枚举值的类型(显式或隐式):
所有的枚举定义和声明都必须是完全一致的(枚举值的类型),特别是不能在一个上下文中声明为无作用域的枚举,在另外一个地方声明为带作用域的枚举。
 

参数匹配和枚举

接收枚举的函数不能使用具有相同的值的整型值:
但是可以将枚举对象传递给接收整形值的函数,枚举将提升为 int 或者 long 等类型。如:
 
 
 
  • C++
  • 聚合类和字面值常量类嵌套类和局部类
    目录