enum的含义
enum枚举类型是C/C++中的一种数据类型,与struct和class一样是用户自定义的类型,其特点在于enum类型的变量取值是有限的,是可以一一列举出来的。
1)enum,也是一个用于创建新类型的关键字,这点雨struct、class、union一样,通常我们要使用它们的时候还需要实例化。
2)enum,与语言(C/C++,C#)中的整型(int)有非常直接的关系。如果你敢想,我们可以这么说,用enum创建的类型,就相当于typdef int enumtype;创建出来的一样。只是enum比它多了一些东西。
3)最经典的一句话:“枚举是一个被命名的整型常数的集合”
enum的使用
C++ enum枚举格式:
enum < 枚举类型名> {< 枚举表>};
enum {< 枚举表>}< 变量名表>;
第一个C++ enum枚举值对应着一个整型数,通常情况下如果其中的枚举常量没有定义数值,那么第一个枚举值对应着常量值0,然后依次递增,如果第一个枚举常量定义了数值,那么其后的值将随之递增,其中每个常量之间用“,”隔开,而不是“;”,最后一个数值不用符号。
enum bool {false,true}; bool类型就是C++预定义的枚举
例如:
enum day...{Sun,Mon,Tue,Wed,Thu,Fri,Sat};//定义一个day的枚举
day d = Sun;
//d只能等于"Sun,Mon,Tue,Wed,Thu,Fri,Sat"中的一个,没有其它值!
cout< < "value is "< < d< < endl; // 0
enum ...{Sun=10,Mon=1,Tue,Wed,Thu,Fri,Sat} d1,d2,d3,d4;
d1 = Sun; d2 = Mon; d3 = Tue; d4 = Wed;
cout< < d1< < " "< < d2< < " "< < d3< < " "< < d4< < endl;
//输出 10 1 2 3
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的取值范围?
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的含义我就不多说了,想怎么去歪解就怎么去歪解^_^
undefined的含义我就不多说了,想怎么去歪解就怎么去歪解^_^
enum的内存分配呢?
比如 e2 需要3bits,那么C++规定e2的尺寸只要容得下3bits就行,到底是取1个byte,还是4个byte,还是...,那由编译器自己决定。但是,C++标准在这里有个限制:1<= sizeof(enmu)<=sizeof(int)简单的说就是找到最少的能容纳下所有的元素的位数
总结
1. 将enum定义在合适的命名空间中 // 有时候在命名空间中直接定义了太多的enmu是不合理的,这样会污染命名空间,所以,尽可能的,我们要在类的内部定义enmu变量。
2. 为enum指定默认值,创建enum变量需要设定初始值,如果没有的话,其值在不同编译环境下未定
3. 同一枚举中枚举子的取值不需要唯一
enum some_fruit {apple = 3, orange, banana = 4, bear};
4. 不能直接将一个整形赋值给枚举变量,即使该int 数在该枚举变量的有效范围内。这种规定是有其道理,因为enum类型本来就是为了限定,所以它就不容许你那么轻易的赋值,当然你可以使用显示的转换方法。
5. 取值范围
如果某个枚举中所有枚举子的值均非负,该枚举的表示范围就是[0:2^k-1],其中2^k是能使所有枚举子都位于此范围内的最小的2的幂;如果存在负的枚举值,该枚举的取值范围就是[-2^k,2^k-1].例如:
6.将一个超过该枚举类型的整形通过显示转换的方式转换然后赋值给相应变量会导致undefined后果。
在枚举范围内的值可以显式赋值,即使不在枚举列表中
例子:
enum SomeCities
{
zhanjiang=1, //1
Maoming, //2
Yangjiang, //3
Jiangmen, //4
Zhongshan = 1000 //1000
};
void printEnum(SomeCities sc)
{
cout<<sc<<endl;
}
int main(void)
{
SomeCities error=SomeCities(1025);// 超过范围,未定义,出错
SomeCities oneCity = SomeCities(50); //将50通过显式转换,为oneCity赋值
printEnum(oneCity); //在VC++ 6 编译器下得到50输出
return 0;
}
以上例子说明,虽然SomeCities的定义里没有赋值为50的枚举值,但是,由于50在该枚举的取值范围内,所以通过显式声明得到一个有定义的枚举值,从而成功传递给printEnum函数。
7.自定义运算符