| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4604 人关注过本帖
标题:enum新解
取消只看楼主 加入收藏
a402730324
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:1233
专家分:0
注 册:2005-12-1
收藏
 问题点数:0 回复次数:2 
enum新解
最近研究C++时,发现一些特别的事情。
以前一直对enum的用法不是很熟,也没有深究,最近又看起了C++,我知道感觉来了,所以就想跟大家分享一下自己的想法。
我们都知道在C中枚举成员被当成了一组常量,跟你用const或者define 定义的常量一样使用,只是这是一种新的类型,在跟整形作比较或者赋值的时候需要强制类型转换。我个人认为enum的用处不是很大,就是有它没它都可以,它主要使用在switch……case 这样的结构中,使用enum主要是提高了程序的可维护性,这就是别人在看你的代码时,不必为这个莫名其妙的数字代表什么含义而抓耳挠腮,提高了程序的可读性。当然了有人说我们可以用const代替,可是当我们要定义一组常量时,使用enum更方便,可以说enum为了我们提高了批量定义常量的功能。
下面浅谈以下enumC++中的用法,跟C还是有很大的不同的。
首先比如你定义 enum tag{one ,two};
这样赋值,int t=tag()||tag(one);
当然了结果是0,感觉有点像类中的默认构造函数;
然后我就突然想到拉,如果我这样定义 enum tag{one=1,two};
这个时候tag()会是多少呢?结果我用VC++2005,得出的结果是0,可是如果我定义一个tag t1,而不给t1赋值,那么t1得值就是1,编译器自动初始化的结果。
然后我又试着用了MinGW编译的结果却都是00,看来这个编译器的支持还不一样。
接着我想用Dev-C++编译,然后根据少数服从多数,没想到这个更玄啦,tag()的结果是0,而t1却是一个莫名其妙的值,就是一个很随机的值。
我当时就晕啦,不知道大家能不能猜到什么原因,可是我仔细想了一想,觉得不会突兀地出现这种奇怪的值,因为这个是一个很小的测试程序,然后就顺理成章的知道了,是因为t1没有初始化,然后编译器读取了一个内存中的值,所以在这里还是要告诉大家,声明变量一定要初始化。
从这里可以看出,dev-c++标准支持最好啦,vc++2005mingw自己给你的变量初始化,并且结果还不一样,你不想写好的程序到另一个编译器就得到莫名其妙的结果吧?所以最好自己初始化。
从这里可以看出,C++C已经很不同啦,C++已经有全部类化的倾向,这也许就是语言的发展吧。还有根据各个编译器不同的结果可以看出,在编译的时候,自动生成了默认构造函数(我们就先这样叫着吧),VC2005Dev-c++MinGW都生成了两个构造函数,分别为tag()tag(int),但是他们各自的实现不同。我们总结一下:用tag()初始化时,不管one等于1还是0,结果都是0,用tag(int)时,结果为实参的值,声明一个tag变量却不初始化时,VC调用的是tag(int),Dev-c++什么都没有调用,MinGW调用的是tag()

希望大家多多指教,特别是对于最后一段的内容,我还有点想的不是很清楚。
收到的鲜花
  • 雨中飞燕2007-12-07 02:45 送鲜花  3朵   附言:原创内容
搜索更多相关主题的帖子: enum 新解 con 
2007-12-03 08:54
a402730324
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:1233
专家分:0
注 册:2005-12-1
收藏
得分:0 
有人思考过enum的内存分布吗?
或者是比较了解的,分享讨论一下。

敢犯强汉者,虽远必诛!——陈汤 不知吾辈何时方能吐出此豪言壮语?
2007-12-03 09:08
a402730324
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:1233
专家分:0
注 册:2005-12-1
收藏
得分:0 
我也是这样想的,本来在我的意识中,enum成员就是一组常量,只是为了提高程序的可读性,不用给他太多的意义。后来我就偶然发现了这个,在MSDN上也没有讲到,编译器却实现啦,比较郁闷,不知道为什么,我这个人有个毛病,生命东西弄不清楚就会好难受。也谈不上钻研,就是想到什么的时候,喜欢从各个方面考虑,老是把自己的脑子弄得筋疲力尽。

还有一点关于C++的想法,还没想好,时间有点紧,想好的话跟大家分享。

敢犯强汉者,虽远必诛!——陈汤 不知吾辈何时方能吐出此豪言壮语?
2007-12-05 23:10
快速回复:enum新解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019520 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved