zoukankan      html  css  js  c++  java
  • Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define

    尽量使用const替换 #define定义常量的原因:

    1. #define 不被视为语言的一部分
    2. 宏定义的常量,预处理器只是盲目的将宏名称替换为其的常量值,导致目标码中出现多分对应的常量,而const定义的常量,会进入记号表,使用到该常量的地方使用的同一份,使目标码的量更小点;

    3. const可以在类中定义一个class专属常量,其作用域限制于class内。(注:如果一个class专属常量又是static又是整数类型,需要特殊处理。主要不取其地址,则,可以声明并使用但是无须提供定义式。如果,需要取地址,则一定要提供定义式)。优秀的编译器不会为整数型const对象设定另外的存储空间。

      1 class GamePlayer
      2 {
      3 private:
      4     static const int NumTurns = 5; //常量声明式 ,没有取其地址,所以定义式可以省略
      5     int scores[NumTurns];
      6 };

      如果要取 NumTurns地址,则一定要提供定义式

      1 const int GamePlayer:: NumTurns; // NumTurns定义式

      上面的定义式,应该放在实现文件中,而非头文件。由于class常量已在声明时获得初值,因此定义时不可以再设初值。

    4. 无法使用#define创建class的专属常量,因为#define并不重视作用域。

    对于类似函数的宏,最好使用inline函数替换 #define:

    1. 宏只是原班不动的替换,所以有时候会出现问题。比如:
      1 #define CALL_WITH_MAX(a, b) f( (a) > (b) ? (a) : (b) )
      2 int a = 5, b = 0;
      3 CALL_WITH_MAX(++a, b); //a被累加二次
      4 CALL_WITH_MAX(++a, b +10); //a被累加一次

      执行的结果和预想的可能不一致。使用template inline函数就可以提供宏一样的效率,以及一般函数的可预料的行为和类型安全。

     

  • 相关阅读:
    UML类关系:依赖、关联、聚合、组合(收藏)
    java常用设计模式八:代理模式
    java常用设计模式三:原型模式
    java常用设计模式总览
    java常用设计模式七:装饰模式
    java常用设计模式六:适配器模式
    Sword C语言原子操作
    C语言 宽字符串
    C语言 字符串切割
    C语言 sscanf函数补充
  • 原文地址:https://www.cnblogs.com/wangjzh/p/4063822.html
Copyright © 2011-2022 走看看