enum在实际中应用比较少,容易被忽略。其实enum 和 struct、class一样,都是用户自定义类型。既然是自定义类型,就可以有他的数据成员,还有成员函数!
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(); //默认构造函数
005: e1 = e(1) //从int构造enum e类型对象的构造函数
006:e1 = a; //默认调用“拷贝构造函数”
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]。
简单的说就是找到最少的能容纳下所有的元素的位数
因为C++标准规定超出枚举类型 表示范围的赋值结果是undefined的,也就是说 e2 x = (e2)6 是肯定正确的,而 e2 y = (e2)8 行为是未定义的。
enum的内存分配,如 e2 需要3bits,那么C++规定e2的尺寸只要容得下3bits就行,到底是取1个byte,还是4个byte,还是...,那由编译器自己决定。但 是,C++标准在这里有个限制:1<= sizeof(enmu)<=sizeof(int)。
以上内容参考自Bjarne Stroustrup的 The C++ Programming Languane