复合数据类型介绍-枚举

一、枚举简介

定义了一种新的数据类型,使用方法与结构体相似,但是必须严格按照限制进行。

enum spec {red, yellow, blue, indigo};

在上例语句中,完成了两件事情:
1、让spec成为了类型的名称,spec被称为枚举。
2、将red、yellow、blue等作为符号常量,对应整数值0-3,这些常量叫做枚举量。在默认情况下,将整数值赋给枚举量,第一个枚举量的值为0,第二个为1,后面以此类推。

二、设置值

1、可以使用赋值运算符显式的设置枚举量的值:

enum bits {one = 1, two = 2, four  = 4. eight = 8}

2、指定的值必须是整数,也可以只显式的定义其中一些枚举量的值:

enum bigstep {first, second = 100, third}

在上例中,first在默认情况下为0, 后面没有初始化的枚举量值将比前面枚举量的值大1, 因此third的值为101。

3、可以创建多个值相同的枚举量:

enum num {zero, null = 0, one, numero_uno = 1};

三、枚举取值范围

最初,对于枚举类型来说,只有声明中指出的枚举量是有效的,可以用于给枚举变量赋值。
现在,可以通过强制转换,增加了可赋值给枚举变量的合法值,每个枚举都有取值范围,通过强制转换,可以将取值范围内的任何整数值赋值给枚举变量,即使这个值不是枚举值。

enum bits {one = 1, two = 2, third = 3, four = 4, eight = 8};
enum myflag;
myflag = bits(6); //valid, because 6 is in bits range

在上例中,6不是声明中的枚举值,但是它位于枚举定义的整数取值范围内(1-8)。
其中取值范围的定义如下:
1、找出上限:先找到枚举量的最大值,找到大于这个最大值的、最小的2的幂,然后将其减去1,得到的便是取值范围的上限,例如去前面定义的bigstep最大枚举值是101,比此数大的最小2的幂是128,因此取值范围为127。
2、找出下限:先找到枚举量的最小值,如果不小于0,则取值范围的下限为0;否则与寻找上限方式相同的方法(找比它小的、最大的2的幂加上负号,在加1)。例如最小枚举值为-6,而比它小的,最大的2的幂是-8(加上负号),因此下限为-7。

四、作用域枚举

C++11提供了新的枚举方式,用于解决传统枚举存在的一些问题。其中之一为两个枚举定义的枚举量同名时会存在冲突。

enum egg {small, medium, large, jumbo};
enum shirt {small, medium, large, xlarge};

如上例所示,此时传统枚举将无法通过编译, 因为这两个枚举位于相同的作用域内,它们的同名枚举量在使用时将发生冲突,为了解决这个问题,C++11将枚举量的作用域限制为类,此时枚举量在使用时都需要枚举名来限定。

egg choice = egg::large;
shirt floyd = shirt::large;

枚举量的作用域为类以后,不同枚举定义内相同名枚举量就不会发生名称冲突了。

C++11中的作用域枚举不支持隐式的转换为整形,但是常规枚举可以,这使用时并不安全。

enum egg {small, medium, large, jumbo};
enum class shirt {small, medium, large, xlarge};
egg one = small;
shirt rolf = shirt::small;
int king  = one;
int ring = rolf;   // not allowed, no implicit type conversion;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值