免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 24904 | 回复: 33
打印 上一主题 下一主题

[C++] 『原创』深入讨论C++的enum [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-30 17:38 |只看该作者 |倒序浏览
enum的秘密<一>:enum是“用户自定义类型”

    呵呵,enum在实际中应用比较少,所以你会忽略它。但是,在这里,我告诉你,enum 和 struct、class一样,都是用户自定义类型。
    对呀!enum是用户自定义类型,他有数据成员,还有成员函数!
For example:
    enum e{a=1 , b=2 , c=4};
那么:
    001: enum e e1;        //enum e不是对象,它是类型,e1才是类型enum的对象!
    002: e e1;                //e是类型enum e的简写哦!

    003: e1 = 1;              //绝对的错误!int怎能赋值给一个用户自定义类型
    004: e1 = e();            //e()? 对呀,你没看错,默认构造函数
    005: e1 = e(1)           //e(int)? 嘿嘿,这才是从int构造enum e类型对象的构造函数
    006:e1 = a;              //哈哈,默认调用“拷贝构造函数”···虽然有点不完备

大胆的想:enum会不会有用户自定义成员函数呢?呵呵,我是没有实验出来。要不,你自己试试?
感想:C++虽然是初期的OO语言,但是类型化的概念已经深入到了语言本身。面对一门OO语言,你要必须知道一件事:一切都是对象,一切都有类型···

enum的秘密<二>:enum的“取值范围”和“内存分配”

先纠正一个常见错误,很多人认为enum是个离散量集合,太理想化了^_^,简单思考一下就破了,不多说,入正题:
如何确定一个enum的取值范围?
For example:
            enum e1{ a=2, b=4 };

首先找到其绝对值的最大值,但为了容易理解,我先不谈负数,也就是先找到其最大值,这里的最大值是4。
4 用二进制表示就是 100,也就是需要3bits才能最小的容纳下4这个值,而3bits所能表示的范围是 0-7,于是e1的取值范围为[0,7]。

现在来看看负数,
            enum e2{ a=-2, b=4 };
其中绝对值最大的是4,需要3bits才能容纳下,但因为可以取负值(而最大元素b=4不是负值),也就是说需要增加一个符号位,那么就需要4bits。
4bits的取值范围是 1000 - 0111(二进制表示),也就是 -8 到 7(十进制表示)。
enum e3{ a=-4, b=2 } 就只需要3bits,取值范围是[-4,3]。


简单的说就是找到最少的能容纳下所有的元素的位数
为什么要获取enum的取值范围?因为C++标准规定超出枚举类型表示范围的赋值结果是undefined的
也就是说 e2 x = (e2)6 是肯定正确的,而 e2 y = (e2)8 行为是未定义的。
undefined的含义我就不多说了,想怎么去歪解就怎么去歪解^_^

enum的内存分配呢?

比如 e2 需要3bits,那么C++规定e2的尺寸只要容得下3bits就行,到底是取1个byte,还是4个byte,还是...,那由编译器自己决定。但是,C++标准在这里有个限制:1<= sizeof(enmu)<=sizeof(int)。嘿嘿。


总结:
这两天看先哲Bjarne Stroustrup的The C++ Programming Language.一句话,感慨啊!一个小小的enum,把OO体现的淋漓尽致,又把对机器底层的操作展示的畅畅快快···以前很多很迷惑的东西,Stroustrup一句依赖具体实现,让我有种戛然而止的感觉···总结了三句话,写个三类人:
    1.java之流应用级语言的拥趸们,口诛笔伐歇歇吧,深度不光你有···别人比你深得多···
    2.C的先哲们···其实,C++根本不是a better C。
    3.所谓学过C++的人儿啊,别停止你学习的步伐,来跟Stroustrup过过招吧!

再总结一句话:标准和实现,两码事!

论坛徽章:
0
2 [报告]
发表于 2008-01-30 18:29 |只看该作者
学习了,c++果然麻烦。
倒还从来没想过enum类型的取值范围的问题,可能因为我只用它来定义常量有关。
此外我一直认为enum元素是int型,没想到标准规定还可以实现成1<= sizeof(enmu)<=sizeof(int),感觉很怪异

论坛徽章:
0
3 [报告]
发表于 2008-01-30 18:32 |只看该作者
突然发觉回错帖子了~~~抱歉抱歉~~~

[ 本帖最后由 gosapphire 于 2008-1-31 23:03 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-01-30 18:39 |只看该作者

回复 #3 gosapphire 的帖子

555555555

辛辛苦苦写了半天,被你给呕吐了······

论坛徽章:
0
5 [报告]
发表于 2008-01-30 18:50 |只看该作者
enum又是一个C与C++行为不同的地方,学习了.

论坛徽章:
0
6 [报告]
发表于 2008-01-30 18:53 |只看该作者
楼主的帖子很好 , 不过看了之后,我更不想用C++了

论坛徽章:
0
7 [报告]
发表于 2008-01-30 20:20 |只看该作者
是啊,一个enum都能复杂成这样,用这类东西开发出的软件能没bug么

论坛徽章:
0
8 [报告]
发表于 2008-01-30 20:50 |只看该作者
想起了一个老外的demo 里面 利用宏使得,enum 在不同平台可以移植的东东了。

不是翘不起c++  很多时候,用到c++ 也发现的确有地方不能掌握,不能发挥威力,这点还是c号

论坛徽章:
0
9 [报告]
发表于 2008-01-30 23:01 |只看该作者
enum是用户自定义类型,他有数据成员,还有成员函数!

enum没有成员函数。

emun语法:
enum-name:
    identifier
enum-specifier:
    enum identifier opt { enumerator-list opt }
enumerator-list:
    enumerator-definition
    enumerator-list, enumerator-definition
enumerator-definition:
    enumerator
    enumerator = constant-expression
enumerator:
    identifier

这两天看先哲Bjarne Stroustrup的The C++ Programming Language.

Bjarne Stroustrup还在,没死。http://www.research.att.com/~bs/
2008年,他还要继续为Texas A&M University上计算机课呢!
《高级编程技术》是他今年上课的内容。
有兴趣的朋友可上 http://parasol.tamu.edu/people/bs/ 瞧瞧。
kenmark 该用户已被删除
10 [报告]
发表于 2008-01-31 10:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP