enum类型的本质.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
enum类型的本质

enum类型的本质 ??? 至从C语言开始enum类型就被作为用户自定义分类有限集合常量的方法被引入到了语言 当中,而且一度成为C++中定义编译期常量的唯一方法(后来在类中引入了静态整型常量)。 ??? 根据上面对enum类型的描述,到底enum所定义出来的类型是一个什么样的类型呢?作为 一个用户自定义的类型其所占用的内存空间是多少呢?使用enum类型是否真的能够起到有限 集合常量的边界约束呢?大家可能都知道enum类型和int类型具有隐示(自动)转换的规则, 那么是否真的在任何地方都可以使用enum类型的变量来代替int类型的变量呢?下面会逐一 回答这些问题。 ??? 1. 到底enum所定义出来的类型是一个什么样的类型呢? ?????? 在C++中大家都知道仅仅有两种大的类型分类:POD类型和类类型(不清楚的可以参 ?????? 见我的其他文章)。enum所定义的类型其实属于POD类型,也就是说它会参与到POD ?????? 类型的隐示转换规则当中去,所以才会出现enum类型与int类型之间的隐示转换现象。 ?????? 那么也就是说enum所定义的类型不具备名字空间限定能力(因为不属于类类型), ?????? 其所定义的常量子具备和enum类型所在名字空间相同的可见性,由于自身没有名字 ?????? 限定能力,所以会出现名字冲突现象。如: ?????????? struct CEType ?????????? { ?????????????? enum EType1 { e1, e2 }; ?????????????? enum EType2 { e1, e2 }; ?????????? }; ?????? 上面的例子会出现e1、e2名字冲突编译时错误,原因就在于枚举子(e1、e2)是 ?????? CEType名字空间中的名字,同样在引用该CEType中的枚举子时必须采用CEType::e1 ?????? 这样的方式进行,而不是CEType::EType1::e1来进行引用。 ??? 2. 作为一个用户自定义的类型其所占用的内存空间是多少呢? ?????? 该问题就是sizeof( EType1 )等于多少的问题,是不是每一个用户自定义的枚举类 ?????? 型都具有相同的尺寸呢?在大多数的32位编译器下(如:VC++、gcc等)一个枚举类 ?????? 型的尺寸其实就是一个sizeof( int )的大小,难道枚举类型的尺寸真的就应该是int ?????? 类型的尺寸吗?其实不是这样的,在C++标准文档(ISO14882)中并没有这样来定义, ?????? 标准中是这样说明的:“枚举类型的尺寸是以能够容纳最大枚举子的值的整数的尺寸”, ?????? 同时标准中也说名了:“枚举类型中的枚举子的值必须要能够用一个int类型表述”, ?????? 也就是说,枚举类型的尺寸不能够超过int类型的尺寸,但是是不是必须和int类型 ?????? 具有相同的尺寸呢?上面的标准已经说得很清楚了,只要能够容纳最大的枚举子的 ?????? 值的整数就可以了,那么就是说可以是char、short和int。例如: ?????????? enum EType1 { e1 = CHAR_MAX }; ?????????? enum EType2 { e2 = SHRT_MAX }; ?????????? enum EType3 { e3 = INT_MAX? }; ?????? 上面的三个枚举类型分别可以用char、short、int的内存空间进行表示,也就是: ?????????? sizeof( EType1 ) == sizeof( char? ); ?????????? sizeof( EType2 ) == sizeof( short ); ?????????? sizeof( EType3 ) == sizeof( int?? ); ?????? 那为什么在32位的编译器下都会将上面三个枚举类型的尺寸编译成int类型的尺寸呢? ?????? 主要是从32位数据内存对其方面的要求进行考虑的,在某些计算机硬件环境下具有对 ?????? 齐的强制性要求(如:sun SPARC),有些则是因为采用一个完整的32位字长CPU处理 ?????? 效率非常高的原因(如:IA32)。所以不可以简单的假设枚举类型的尺寸就是int类 ?????? 型的尺寸,说不定会遇到一个编译器为了节约内存而采用上面的处理策略。 ??? 3. 使用enum类型是否真的能够起到有限集合常量的边界约束呢? ?????? 首先看一下下面这个例子: ?????????? enum EType { e1 = 0, e2 }; ?????????? void func1( ETy

文档评论(0)

youshen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档