• effective C++ 2 prefer consts, enums and inlines to #defines


    如果有#define A 1.23

    这个记号A可能没进入记号表,那么如果在运用这个常量时发生了编译错误,错误信息提到了1.23而不是A,那么追踪这个错误就很费时,因为不知道这个1是哪里来的.

    而如果用const double A = 1.23,那么A肯定会进入记号表,也就避免了上面的情况。并且对于浮点常量,常量可能比使用#define导致较小的码(因为如果是宏名称,会无条件把所有的A替换成1.23的)。

    用常量替换#define时需要注意两种情况:

    1.为了方便被多个文件引入,常量定义一般放在头文件里。对于常量指针,要把指针声明为const。

    2.class专属常量。这也是优于#define的一个地方,因为#define不存在作用域一说。如果需要将常量的作用域限于class,那么需要让它成为class的一个成员,并且只有一个实体,所以它要是一个static成员。

    而在class内部的只能算是声明式,所以还需要在一个实现文件里加入定义式,比如:

    class A {
    
    private:
    
      static const int Num;//static class 常量声明
      int array[Num];
    };
    const int A::Num;//static class常量定义,在实现文件里

    假如编译器不支持static整数型class常量完成in class初值设定,那么可以采用enum hack,就是一个属于枚举类型的数值可以被当作int使用:

    可以把上面的A改成这样:

    class A {
    
    private:
    
      enum {Num =5}
      int array[Num];
    };

    最后提到了用inline函数替代像函数一样的宏,后面似乎会更详细的说明,所以先放一下。

  • 相关阅读:
    bzoj 1051: [HAOI2006]受欢迎的牛
    bzoj 1192: [HNOI2006]鬼谷子的钱袋
    一些动规水题
    USACO 2014 Open Silver Fairphoto
    USACO 2013 Nov Silver Pogo-Cow
    09day1
    09day2
    08day2
    08day1
    07day2
  • 原文地址:https://www.cnblogs.com/parapax/p/3635104.html
Copyright © 2020-2023  润新知