深入讨论C++的enum

http://www.linuxsky.org/doc/dev/200802/248.html


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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 1.0操作系统是微软第一次对个人电脑操作平台进行用户图形界面的尝试。Windows 1.0基于MS-DOS操作系统。Windows 1.0本质上宣告了DOS操作系统的终结。 <br> <br>Microsoft Windows 1.0于1985年11月发布,最初售价为100美元;当时被人所青睐的GUI电脑平台是GEM及DESQview/X,因此用户对Windows 1.0的评价并不高。 <br>  <br>界面管理器并不是真正的Windows 1.0,1983年微软宣布将开始设计WindowsWindows1.0 的设计工作花费了55个开发人员整整一年的时间,直到1985年11月20日才正式发布,它基于MS-DOS2.0,界面已经比界面管理器大有改观。<br>  <br>Windows 1.0中鼠标作用得到特别的重视,用户可以通过点击鼠标完成大部分的操作。Windows 1.0 自带了一些简单的应用程序,包括日历、记事本、计算器等等。总之,现在看那时的Windows 1.0,总会让人感到它像是一个PDA,甚至可能功能还赶不上现在的PDA,不过这在当时已经相当吸引人了。Windows 1.0的另外一个显著特点就是允许用户同时执行多个程序,并在各个程序之间进行切换,这对于DOS来说是不可想象的。<br>  <br>Windows 1.0 可以显示256种颜色,窗口可以任意缩放,当窗口最小化的时候桌面上会有专门的空间放置这些窗口(其实就是现在的任务栏)。<br>  <br>在Windows 1.x中另外一个重要的程序是控制面板(Control Panel),对驱动程序、虚拟内存有了明确的定义,不过功能非常有限。<br><br>Microsoft Windows 1.0系统组件:MS-DOS Executive, Calendar, Cardfile, Notepad, Terminal, Calculator, Clock, Reversi, Control Panel, PIF (Program Information File) Editor, Print Spooler, Clipboard, RAMDrive, Windows Write, Windows Paint. <br><br>Windows 1.0的启动画面像极了臭名昭著的蓝屏死机。 <br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值