zoukankan      html  css  js  c++  java
  • c& c++ enum

    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范围内才处理。) 
           使用枚举能在一定程度上减轻这种尴尬(注1),它不但能实现类似于之前定义三个常量的功能,还能够将这三个值组合起来成为独一无二的组。例如: 
          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、枚举的定义 
          一个枚举是一个类型,可以保存一组由用户刻画的值。定义之类,枚举的使用很像一个整数类型。 
    枚举的定义具有以下形式,即以关键词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)的几个城市分类了。
  • 相关阅读:
    unix domain socket 浅析
    Python单元测试的Mock是怎么回事
    三招搞定你的ubuntu安全问题
    思考一次整体调整Python项目规范性的过程
    不可缺少的程序埋点
    python + unittest + request + parameterized 参数化遇到中文名称testcase不显示的问题
    【CDH】cdh搭建遇到的坑和解决过程
    [Linux系统]安装时出现Requires: libc.so.6(GLIBC_2.17)(64bit) Requires: systemd Requires: libstdc++.so时解决办法
    【Linux命令】在Linux服务器上与windows通过SCP命令互传文件时出现的问题排查过程
    【微信公众号】记一次微信活动微信公众号分享没有LOGO的解决心路历程
  • 原文地址:https://www.cnblogs.com/yxzfscg/p/4753283.html
Copyright © 2011-2022 走看看