7.2 枚举声明

7.2 枚举声明

1、枚举是一种由命名常量构成的独立类型(3.9.1)。在其作用域内,其名字被称为枚举名

enum-name:

identifier

enum-specifier:

enum identifieropt { enumerator-listopt }

enumerator-list:

enumerator-definition

enumerator-list , enumerator-definition

enumerator-definition:

enumerator

enumerator = constant-expression // 初始化体枚举符定义

enumerator:

identifier

enumerator-list中的标识符被声明为常量,并且可以出现在任何需要常量的地方。带=enumerator-definitionconstant-expression表示的值赋给关联的enumerator。这个常量表达式必须为整型或枚举类型。如果第一个枚举符不带初始化体,其所对应的常量值为0。不带初始化体枚举符定义枚举符的值置为上一个枚举符的值加1

2、例如:

enum { a, b, c=0 };

enum { d, e, f=e+2 };

定义acd0be1f 3]

3、枚举符的声明点仅跟在枚举符定义之后。例如:

const int x = 12;

{ enum { x = x }; }

在这里,枚举符x被初始化为常量x的值,即12

4、每一个枚举定义了一种不同于所有其他类型的类型。在枚举说明符的闭括号之后,每一个枚举符都具有其所属枚举的类型。在闭括号之前,每个枚举符的类型等于其初始值的类型。如果为枚举符指定了初始化体,初始值具有和表达式相同的类型。如果没有为第一个枚举符指定初始化体,其类型为不确定的整型。其他情况下,枚举符的类型等同于上一个枚举符的初始值类型,除非增量值超出了这个类型的表示范围,这时候枚举符的类型为足够容纳此增量值的不定整型。

5、枚举的基础类型是能够表示在枚举中定义的所有枚举符值的整数类型。由编译器定义使用哪一种整型作为枚举的基础类型,但是基础类型不应该大于int,除非某个枚举符值超过了intunsigned int的表示范围。当enumerator-list为空时,基础类型等价于包含单个值为0的枚举符的枚举的基础类型。当sizeof()作用于枚举类型、枚举类型对象或枚举符的时候,其值等于sizeof()作用于基础类型的值。

6、对于最小枚举符为emin和最大枚举符为emax的枚举来说,其值域为基础类型中从bminbmax的值域,其中bminbmax分别是能存储eminemax的最小位域的最小值和最大值。定义枚举的值为其枚举符之外的值是允许的。

7、如果两个枚举类型具有相同的基础类型,则它们是布局兼容的。

8、通过整型提升(4.5),枚举符或枚举类型对象的值可被转换为整型。例如:

       enum color { red, yellow, green=20, blue };

color col = red;

color* cp = &col;

if (*cp == blue) // ...

首先定义color为一种描述各种颜色的类型,然后声明col为此类型的对象,cp为指向此类型的指针。color对象可取的值有red, yellow, green, blue;这些值能被转换为整型值0, 1, 2021。由于枚举为独立的类型,所以color对象只能被赋予color类型的值。

color c = 1;           // error: type mismatch,

// no conversion from int to color

int i = yellow;        // OK: yellow converted to integral value 1

// integral promotion

9、算术类型或枚举类型表达式可被显式地转换为枚举类型。只要是在枚举类型的值域范围之内,转换前后的值是相同的;否则所得的枚举值是不确定的。

10、枚举说明符声明的枚举名和所有的枚举符都位于和枚举说明符相同的作用域中。这些名字遵从在(3.3)和(3.4)中为所有名字定义的作用域规则。在类作用域中声明的枚举符可通过类成员访问操作符(::, .(点号)和->(箭头))引用,参见5.2.5。例如:

class X {

public:

enum direction { left=’l’, right=’r’ };

int f(int i)

{ return i==left ? 0 : i==right ? 1 : 2; }

};

 

void g(X* p)

{

direction d;          // error: direction not in scope

int i;

i = p->f(left);               // error: left not in scope

i = p->f(X::right);   // OK

i = p->f(p->left);   // OK

// ...

}

posted @ 2006-04-18 13:56  Goncely  阅读(334)  评论(0编辑  收藏  举报