zoukankan      html  css  js  c++  java
  • 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函数替代像函数一样的宏,后面似乎会更详细的说明,所以先放一下。

  • 相关阅读:
    机器学习--决策树
    插入排序、选择排序的实现与性能比较
    【笔记】如何实现属性可修改的函数装饰器
    【笔记】如何为被装饰的函数保存元数据
    【笔记】对文件的一些操作
    【笔记】对字符串的一些操作
    USB鼠标按键驱动
    LCD驱动 15-3
    LCD驱动 15 -2
    LCD驱动 15-1
  • 原文地址:https://www.cnblogs.com/parapax/p/3635104.html
Copyright © 2011-2022 走看看