枚举类型概述[C++]

C++的enum工具提供了一种创建符号常量的方式,可以代替const。它允许定义新类型,但有严格限制。

使用enum的句法与使用结构struct相似。

  • 让spectrum成为新类型的名称,spectrum被成为枚举(enumeration),就像struct变量被成为结构一样。
  • 将red、orange等作为符号常量,即枚举量。
  • 默认情况下,将整数值赋给枚举量,第一个枚举量值为0,第二个为1,依次类推。可通过显示地指定整数值来覆盖默认值。
  • 可以用枚举名来声明这种类型的变量。
  • 若打算只用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称。
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet}; //定义
spectrum band; //声明
enum {red, orange, yellow, green, blue, violet, indigo, ultraviolet}; //定义,只用常量

枚举变量有一些特殊的属性。

  • 在不进行强制类型转换的情况下,只能将定义枚举时使用的枚举量赋给这种枚举的变量。spectrum只有8个可能的值。
  • 若将一个非法值赋给枚举变量,有些编译器会错误,有些则只发出警告。为了最大限度的可移植性,应避免这种非法赋值。
  • 枚举只定义赋值运算符,没有其它算术运算。有些实现并没有这种限制,为了最大限度的可移植性,应用较为严格的限制。
  • 枚举量时整型,可以被提升为int类型,但int类型不能自动转换为枚举类型。有些实现没有这种限制。
  • 如果int值是有效的,可以通过强制类型转换,将它赋给枚举变量。
  • 如果对一个不适当的值进行强制类型转换,结果是不确定的,不会出错,但不能依赖得到的结果。
spectrum band; //声明
band = orange; //有效赋值
band = 2000; //无效赋值

band = orange; //有效
++band; //无效
band = orange + red; //无效,orange + red结果为1,是int值,int不能赋给枚举型spectrum的band

int color = blue; //有效
band = 3; //无效,int值无法转换为枚举型spectrum
color = 3 + red; //有效

band = spectrum(3); //有效转换
band = spectrum(40003); //未定义的结果

赋值运算能按需要设置枚举量的值。

  • 指定的值必须是整数。
  • 可以只显式地定义其中一些枚举量。
  • 第一个默认为零,后面依次大1。如果有被显式覆盖的枚举量,后面没有被初始化的枚举量值在此基础上大1。
  • 在早期C++中,只能将int值(或提升的值)赋给枚举量,但这种限制取消了,现在可以使用long甚至long long类型的值。
enum bits{one = 1, two = 2, four = 4, eight = 8};
enum bigstep{first, second = 100, third = 100, fourth}; //first默认为0,fourth为101

最初只有枚举声明中指出的那些值是有效的。然而C++现在通过强制类型转换,增加了赋给枚举变量的合法值。每个枚举都有取值范围,通过强制类型转换,可以将取值范围中的任意整数值赋给枚举变量,即使这个值不是枚举值。

  • 要找出上限,需要知道枚举量的最大值,找到这个大于此最大值而又满足最小的2的幂,将它减1,即为取值范围上限。
  • 要计算下限,需要知道枚举量的最小值。若它不小于0,则取值下限为0;若它小于0,则采用与寻找上限相同的方式。
enum bits{one = 1, two = 2, four = 4, eight = 8}; //取值范围0~15
enum bigstep{first = -6, second = 100, third = 122, }; //取值范围-7~127

选择用多少空间来存储枚举由编译器决定。

  • 对于取值范围较小的枚举,使用一个字节或更少的空间。
  • 对于包含long类型值的枚举,则使用4个字节。

C++11扩展了枚举,增加了作用域内枚举。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贫道绝缘子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值