enum新解
最近研究C++时,发现一些特别的事情。以前一直对enum的用法不是很熟,也没有深究,最近又看起了C++,我知道感觉来了,所以就想跟大家分享一下自己的想法。
我们都知道在C中枚举成员被当成了一组常量,跟你用const或者define 定义的常量一样使用,只是这是一种新的类型,在跟整形作比较或者赋值的时候需要强制类型转换。我个人认为enum的用处不是很大,就是有它没它都可以,它主要使用在switch……case 这样的结构中,使用enum主要是提高了程序的可维护性,这就是别人在看你的代码时,不必为这个莫名其妙的数字代表什么含义而抓耳挠腮,提高了程序的可读性。当然了有人说我们可以用const代替,可是当我们要定义一组常量时,使用enum更方便,可以说enum为了我们提高了批量定义常量的功能。
下面浅谈以下enum在C++中的用法,跟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编译的结果却都是0,0,看来这个编译器的支持还不一样。
接着我想用Dev-C++编译,然后根据少数服从多数,没想到这个更玄啦,tag()的结果是0,而t1却是一个莫名其妙的值,就是一个很随机的值。
我当时就晕啦,不知道大家能不能猜到什么原因,可是我仔细想了一想,觉得不会突兀地出现这种奇怪的值,因为这个是一个很小的测试程序,然后就顺理成章的知道了,是因为t1没有初始化,然后编译器读取了一个内存中的值,所以在这里还是要告诉大家,声明变量一定要初始化。
从这里可以看出,dev-c++标准支持最好啦,vc++2005和mingw自己给你的变量初始化,并且结果还不一样,你不想写好的程序到另一个编译器就得到莫名其妙的结果吧?所以最好自己初始化。
从这里可以看出,C++跟C已经很不同啦,C++已经有全部类化的倾向,这也许就是语言的发展吧。还有根据各个编译器不同的结果可以看出,在编译的时候,自动生成了默认构造函数(我们就先这样叫着吧),VC2005、Dev-c++、MinGW都生成了两个构造函数,分别为tag()和tag(int),但是他们各自的实现不同。我们总结一下:用tag()初始化时,不管one等于1还是0,结果都是0,用tag(int)时,结果为实参的值,声明一个tag变量却不初始化时,VC调用的是tag(int),而Dev-c++什么都没有调用,MinGW调用的是tag()。
希望大家多多指教,特别是对于最后一段的内容,我还有点想的不是很清楚。