C++学习笔记之七 复合类型---枚举

C++的enum工具提供了另一种创建符号常量的方式,这种方式可以代替const。使用enum的句法与使用结构相似,例如:enum spectrum { red,  orange , yellow,  green, blue,  violet,  indigo  ,ultraviolet};

这条语句有两个含义:

(1)、让spectrum成为新类型的名称:spectrum被称为枚举,就像struct变量被称为结构一样

(2)、将red 、orange、yellow等作为符号常量,它们对应的整数值0~7.这些常量叫做枚举量。

这个地方需要做一下说明:spectrum是类型名称,就像int、long一样,是类型的名称,以后可以用这个类型名称声明变量。另外,用这个类型声明的变量取值必须是大括号里的值,其他值无效。而且默认的情况下,第一个枚举量的值为0,第二个为1,以此类推。也可以显示的指定整数值来覆盖默认值。

可以用枚举名来声明这种类型的变量:spectrum  band;

下面介绍一下枚举变量的特殊属性:

1、在不进行强制类型转换的情况下,只能将定义枚举时使用的枚举量赋给这种枚举的变量。

band = blue;       //有效,因为blue是枚举量中的一个

band =2000;     //无效,2000不是枚举量

因此,spectrum变量受到限制,只有8个可能的值,试图将非enum值赋给enum变量出现编译器错误。

2、对于枚举,只定义了赋值运算符。具体来说,没有为枚举定义算数运算符

band = orange;      //有效

++band;       //无效

band = orange +red;           //无效

3、枚举量是整型,可被提升为int类型,但是int类型不能自动转换为枚举类型。

int color = blue;        //有效

band = 3;      //无效,虽然3对应的green,但是不能这么赋值。除非经过强制类型转换band = spectrum(3);

color = 3+ red;         //有效

4、当然,如果打算只使用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称。如下:

enum { red,  orange , yellow,  green, blue,  violet,  indigo  ,ultraviolet};

5、设置枚举量的值

可以使用赋值运算符来显式的设置枚举量的值:

enum bits{ one  = 1,  two  =2,  four  =4, eight  =8};

指定的值必须是整数。也可以只显式的定义其中一些枚举量的值:

enum  bigstep{ first,  second =100, third};

这里first默认情况下是0,后面没有被初始化的枚举量的值将比其前面的枚举量大1.因此,third的值为101。

另外,可以创建多个值相同的枚举量:

enum {zero, null = 0, one, numero_uno  =1};

其中,zero和null都为0,one和umero_uno都为1。

说明:其实枚举量可以作为一种创建整数与代表字符的对应关系。比如用在switch语句中,先用enum{one,two,three,...},在switch语句中就可以用case  one:  case  two:   ....了。

6、枚举的取值范围

每个枚举值都有取值范围,通过强制类型转换,可以将取值范围中的任何整数值赋给枚举变量,即使这个值不是枚举值。例如:

enum  bits{ one =1,  two = 2, four = 4,  eight = 8};

bits  myflag;

则下面的代码将是合法的:

myflag = bits(6);            //因为6在bits的范围之内

取值范围是这么定义的:

(1)上限值:找到大于这个最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。例如,bitstep的最大值枚举值为101.在2的幂中,比这个数大的最小值为128,因此取值范围的上限为127.

(2)下限值:需要知道枚举值的最小值,如果它不小于0,则取值范围的下限为0;否则采用与寻找上限方式相同的方式,但加上负号。例如,如果最小枚举值是-6,而比它小的、最大的2的幂是-8(加上负号),因此下限是-7.

你可能感兴趣的:(枚举,C++Primer,Plus第6版)