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