enum

enum

enum [tag] {enum-list} [declarator];   // for definition of enumerated type

enum tag declarator;   // for declaration of variable of typetag

The enum keyword specifies an enumerated type.

An enumerated type is a user-defined type consisting of a set of named constants called enumerators. By default, the first enumerator has a value of 0, and each successive enumerator is one larger than the value of the previous one, unless you explicitly specify a value for a particular enumerator. Enumerators needn’t have unique values. The name of each enumerator is treated as a constant and must be unique within the scope where theenum is defined. An enumerator can be promoted to an integer value. However, converting an integer to an enumerator requires an explicit cast, and the results are not defined.

In C, you can use the enum keyword and the tag to declare variables of the enumerated type. In C++, you can use the tag alone.

In C++, enumerators defined within a class are accessible only to member functions of that class unless qualified with the class name (for example,class_name::enumerator). You can use the same syntax for explicit access to the type name (class_name::tag).

For related information, see class and struct.

Example

// Example of the enum keyword
enum Days               // Declare enum type Days
{
   saturday,            // saturday = 0 by default
   sunday = 0,          // sunday = 0 as well
   monday,              // monday = 1
   tuesday,             // tuesday = 2
   wednesday,           // etc.
   thursday,
   friday
} today;                // Variable today has type Days

int  tuesday;           // Error, redefinition of tuesday

enum Days yesterday;    // Legal in C and C++
Days tomorrow;          // Legal in C++ only

yesterday = monday;

int i = tuesday;        // Legal; i = 2
yesterday = 0;          // Error; no conversion
yesterday = (Days)0;    // Legal, but results undefined

  1. #include < iostream.h> 
  2.  
  3. void main()  
  4. ...{  
  5. //例1  
  6. enum day...{Sun,Mon,Tue,Wed,Thu,Fri,Sat};//定义一个day的枚举  
  7. day d = Sun
    //d只能等于"Sun,Mon,Tue,Wed,Thu,Fri,Sat"中的一个,没有其它值!  
  8. cout< < "value is "< < d< < endl;  
  9.  
  10. //也可以定义多个变量  
  11. enum day...{Sun,Mon,Tue,Wed,Thu,Fri,Sat};  
  12. day d1,d2,d3;  
  13. d1 = Thud2 = Satd3 = Tue;  
  14. cout< < "d1 && d2 && d3 "< < d1< < " "< < d2< < " "< < d3< < endl;  
  15.  
  16. //例2  
  17. enum ...{Sun,Mon,Tue,Wed,Thu,Fri,Sat} d;  
  18. d = Mon;  
  19. cout< < "value is "< < d< < endl;  
  20.  
  21. //例3  
  22. enum ...{Sun=10,Mon,Tue,Wed,Thu,Fri,Sat} d1,d2,d3,d4;  
  23. d1 = Sund2 = Mond3 = Tued4 = Wed;  
  24. cout< < d1< < " "< < d2< < " "< < d3< < " "< < d4< < endl
    //输出 10 11 12 13  
  25.  
  26. //例4  
  27. enum ...{Sun=10,Mon=1,Tue,Wed,Thu,Fri,Sat} d1,d2,d3,d4;  
  28. d1 = Sund2 = Mond3 = Tued4 = Wed;  
  29. cout< < d1< < " "< < d2< < " "< < d3< < " "< < d4< < endl
    //输出 10 1 2 3  


1、为什么要用enum 

      写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生的成绩分A,B,C,D等,天气分sunny, cloudy, rainy等等。 
      更常见的,打开一个文件可能有三种状态:input, output和append. 典型做法是,对应定义3个常数,即: 
      
      const int input  = 1; 
      const int output = 2; 
      const int append = 3; 
//然后,调用以下函数: 
      bool open_file(string file_name, int open_mode); 
//比如, 
      open_file("Phenix_and_the_Crane", append); 
      这种做法比较简单,但存在许多缺点,主要的一点就是无法限制传递给open_file函数的第2个参数的取值范围,只要传递int类型的值都是合法的。(当然,这样的情况下的应对措施就是在open_file函数内部判断第二个参数的取值,只有在1,2,3范围内才处理。) 
      使用枚举能在一定程度上减轻这种尴尬,它不但能实现类似于之前定义三个常量的功能,还能够将这三个值组合起来成为独一无二的组。例如: 
      enum open_modes {input = 1, output, append}; 
 //以上定义了open_modes为枚举类型enumeration type。每一个命名了的枚举都是唯一的类型,是一个类型标示器type specifier。例如,我们可以重新写一个open_file函数: 
      bool open_file(string file_name, open_modes om); 
      在open_modes枚举中,input, output, append称为枚举子enumerator, 它们限定了open_modes定义的对象的取值范围。这个时候,调用open_file函数和之前的方法还是一模一样: 
      open_file("Phenix_and_the_Crane", append); 
     但是,如果传递给open_file的第二个参数不是open_modes枚举类型值的话(注1),那么编译器就会识别出错误;就算该参数取值等价于input, output, append中的某个, 
也一样会出错哦!例如:   

      open_file("Phenix_and_the_Crane", 1);


2、枚举的定义 

C++ enum枚举格式:

enum < 枚举类型名> {< 枚举表>};

enum {< 枚举表>}< 变量名表>;

 

第一个C++ enum枚举值对应着一个整型数,通常情况下如果其中的枚举常量没有定义数值,那么第一个枚举值对应着常量值0,然后依次递增,如果第一个枚举常量定义了数值,那么其后的值将随之递增,其中每个常量之间用“,”隔开,而不是“;”,最后一个数值不用符号。

enum bool {false,true};  bool类型就是C++预定义的枚举

      一个枚举是一个类型,可以保存一组由用户刻画的值。定义之类,枚举的使用很像一个整数类型。 
枚举的定义具有以下形式,即以关键词enum开头,接着一个可选的枚举名,下来是由大括号{}包含着一个由逗号分隔的枚举子列表enumerators list: 
enum [enumeration name] {enumerator1[=value1], enumerator2[=value2], ...};

3、枚举子的类型和取值 
      枚举子的类型就是它所在的那个枚举,例如前面说到的open_modes枚举中,input,output和append等枚举子的类型都是open_modes。这种做法,其实是为了赋予用户和编译器一些有关该变量拟议中的用途的提示。 

      默认下,第一个枚举子被赋值0,接下来的枚举子取值是前面一个枚举子的取值+1,例如: 

     enum weather {sunny, cloudy, rainy, windy}; 
//其中 
     sunny == 0, 
     cloudy == 1, 
     rainy == 2, 
     windy == 3; 
以上是默认情况,有时候我们希望显式地指定某个枚举子的值,那么会出现什么情况呢?看看: 
       enum some_fruit {apple = 3, orange, banana = 4, bear}; 
       好了,apple == 3, banana == 4; 那么orange和bear呢?记得前面说过一句,默认下”接下来的枚举子取值是前面一个枚举子的取值+1“。既然这两个枚举子没有显式赋值,那么就按照默认规则办事,所以 orange == 4, bear == 5. 
       从这个例子也可以看出,同一枚举中枚举子的取值不需要唯一。这样有什么用处呢?下面是个简单的例子: 

 enum some_big_cities { 
                                               Guangzhou   = 4, 
                                               Shenzhen    = 4, 
                                               Hongkong    = 4, 
                                               Shanghai    = 2, 
                                               Beijing     = 3, 
                                               Chongqi     = 3 
                                           }; 
//以上简单地按区域,将五个城市按照华南(4),华东(2), 华北(3)的几个城市分类了。


4、枚举变量的定义、初始化和赋值 
     既然每个枚举都是一个类型,那么由这个类型自然可以声明变量,例如,由前面定义的some_big_cities: 
     some_big_cities where_I_am; 
     需要注意的是,在声明where_I_am时没有初始化,如果这时打印where_I_am的值: 
 enum some_big_cities { 
                                            Guangzhou = 4, 
                                            Shenzhen = 4, 
                                            Hongkong = 4, 
                                            Shanghai = 2, 
                                            Beijing = 3, 
                                            Chongqi = 5}; 
int main(void) 
{ 
     some_big_cities wh; 
     cout<<"the value is: "<<wh<<endl; 
     return 0; 
} 
//输出将是the value is: 1. 然而,如果声明wh为全局变量,则另一种情况: 
enum some_big_cities {Guangzhou = 1 Shenzhen = 1, Hongkong = 1, 
                                       Shanghai = 2, Beijing = 3, Chongqi = 5}; 
some_big_cities wh; 
int main(void) 
{ 
   cout<<"the value is: "<<wh<<endl;   
   return 0; 
} 
//输出将是the value is: 0; 
  以上结果是在Visual C++ 2005 Express中得到,不知道其它编译器情况如何,也不知为什么得到这样的结果。下来再找找资料。 
     定义一个枚举变量时,可以给它初始化,例如: 
     some_big_cities wh = Guangzhou; 
     注意等号右边只能取枚举子中的某一个;特别地,以Guangzhou为例,虽然Guangzhou==4, 但以下初始化是出错的: 
     some_big_cities wh = 4; 
     Visual C++ 2005编译器提示: 
error C2440: 'initializing' : cannot convert from 'int' to 'some_big_cities' 
      可见,不能直接地把一个整型赋值给一个枚举变量,因为枚举和整型是不同类型的,除非显式转换。关于枚举与整型的关系,后面再讲。 

      除了初始化,枚举变量也有赋值运算: 
     some_big_cities wh; 
     wh = Guangzhou; 
     wh = Shanghai; 
//或者 
    some_big_cities wh1 = Guangzhou; 
    some_big_cities wh2 = Shanghai; 
    wh2 = wh1;


5、枚举的取值范围 
   如果某个枚举中所有枚举子的值均非负,该枚举的表示范围就是[0:2^k-1],其中2^k是能使所有枚举子都位于此范围内的最小的2的幂;如果存在负的枚举值,该枚举的取值范围就是[-2^k,2^k-1].例如:

    enum e1 {dark, light}; //范围0:1 
    enum e3 {min = -10, max = 1000}; //范围-1024:1023


6、枚举与整型的关系 
    整型值只能显式地转换成一个枚举值,但是,如果转换的结果位于该枚举取值范围之外,则结果是无定义的。 

     enum e1 {dark = 1, light = 10}; 
     e1 VAR1 = e1(50); //无定义 
     e1 VAR2 = e1(3); //编译通过 
      在这里也说明了不允许隐式地从整型转换到枚举的原因,因为大部分整型值在特定的枚举里没有对应的表示。 
      至于枚举可以当作特定的整型数来用的例子,从open_modes可以体会。

7、自定义运算符 
      枚举是用户自定义类型,所以在用户可以为它定义自身的操作,例如++或者<<等。但是,在没有定义之前,不能因为枚举像整型就可以默认使用,例如: 
enum SomeCities 
{ 
   zhanjiang, 
   Maoming, 
   Yangjiang, 
   Jiangmen, 
   Zhongshan 
}; 
SomeCities oneCity = Yangjiang; 
for (oneCity = zhanjiang; oneCity != Zhongshan; ++oneCity) 
{ 
   cout<<oneCity<<endl;
   cout<<oneCity + Yangjiang<<endl;//正确 
   cout<<oneCity + oneCity<<endl;//正确 
} 
以上的++OneCity是没有定义的,在Visual C++ 6 编译下得到如下错误: 
error C2675: unary '++' : 'enum main::SomeCities' does not define this operator or a conversion to a type acceptable to the predefined operator.


转改自:http://www.cnblogs.com/ifaithu/articles/2638218.html

http://m.blog.csdn.net/article/details?id=6454057

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值