第 22 讲:枚举
前文解决了两种需要带关键字的自定义类型:结构体和共用体,它们的用法也是各有各的好处和奇特之处。今天我们来看一种新的带关键字的类型:枚举类型(Enumerations)。
什么是枚举类型?
枚举类型一般用于列举一些特殊情况时,特别这些情况的范围仅仅只有可以数出来的几种情况的时候,我们就可以使用这种类型,例如星期。
我们可以使用枚举类型为星期定义一个枚举类型,写法是这样的:
我们把枚举的每一个数值放到枚举的大括号里,然后把每一个枚举数值写进去就可以了。枚举类型一般是需要对应数值使用的,否则我们无法做到灵活使用枚举的效果。所以我们一般都会配合整数使用,为每一个枚举数值赋一个整数值;当然,如果不赋值,那么从第一个元素开始,就以 0 为起始点开始往下顺序默认赋值;如果为其某一个数值赋值,那么后面的元素不赋值也可以得到默认数值,这些数值就从赋值的数值开始自动递增 1 个单位。
这个写法等价于前者。
当然,如果 monday
字段不赋值的话,那么整体就会从 0 开始计算,即 monday
赋值为 0、tuesday
赋值为 1、wednesday
赋值为 2,等等。
使用
枚举类型出乎意料得好用。为什么这么说呢?因为枚举类型一般都不会用类型名称(即这里的 enum week
,当然有时候也可以用上),而大多直接把里面的数值代入到指定位置上去就完成了使用。比如:
从代码里可以发现,每一个 case
标签处跟的直接是枚举字段,而且不需要使用成员访问运算符这种奇怪的东西,也不需要类型名称来作为辅助操作。
实际上,我们也可以从这种角度认为,bool
是一种枚举类型,因为它的声明语句可以是这样的。
这样 false
字段就赋值为 0,而 true
自动赋值为 1。
枚举类型的内存大小
当然,bool
类型并不是这么简单,因为 bool
仅仅占据一个字节,而枚举类型需要整数的依托,所以枚举类型的大小一般是 4 个字节(即 int
占据多大,枚举就多大)。