• 条款1:尽量用const和inline而不用#define


    原文链接

    尽量用const和inline而不用#define

    也称为:尽量用编译器而不用预处理。

    原因:

    (1)#define ASPECT_RATIO 1.653 编译前预处理程序会将ASPECT_RATIO 替换为1.653,编译出错时只会指出1.653,而无法跟踪ASPECT_RATIO,不便于调试

    (2)#define max(a,b) ((a) > (b) ? (a) : (b))

    有可能出错:

    int a = 5, b = 0;

    max(++a, b);// a 的值增加了2

    max(++a, b+10); // a 的值只增加了1

    解决方法:

    (1)      用const 而不用#define

    const double ASPECT_RATIO = 1.653;

    (2)用inline而不用#define

    inline int max(int a, int b) { return a > b ? a : b; }

    内联函数既有宏的效率,又有可预计的行为和类型安全保证。

    为了可以使用多种类型可以用模板:、

    template<class T>

    inline const T& max(const T& a, const T& b)

    { return a > b ? a : b; }

    -----------------------------------------------------补充说明:--------------------------------------------------------

    类中常量的使用:

    (1)要把常量限制在类中,首先要使它成为类的成员;为了保证常量最多只有一份拷贝,还要把它定义为静态成员:

    class GamePlayer {

    private:

        static const int NUM_TURNS = 5; // constant eclaration

        int scores[NUM_TURNS];      // use of constant

        ...

    };

    上面的语句是NUM_TURNS的声明,而不是定义,所以还必须在类的实现代码文件中定义类的静态成员:

    const int GamePlayer::NUM_TURNS;    // mandatory definition;

            // goes in class impl.file

    (2)旧一点的编译器会不接受这种语法,因为它认为类的静态成员在声明时定义初始值是非法的;而且,类内只允许初始化整数类型(如:int, bool, char 等),还只能是常量。
    在上面的语法不能使用的情况下,可以在定义时赋初值:

    class EngineeringConstants { // this goes in the class

    private:        // header file

        static const double FUDGE_FACTOR;

        ...

    };

        // this goes in the class implementation file

        const double EngineeringConstants::FUDGE_FACTOR = 1.35;

    (3)但是当类在编译时需要用到这个类的常量,例如上面GamePlayer::scores数组的声明(编译过程中编译器一定要知道数组的大小),为了弥补那些(不正确地)禁止类内进行整型类常量初始化的编译器的不足,可以采用称之为“借用enum”的方法来解决。这种技术很好地利用了当需要int类型时可以使用枚举类型的原则,所以GamePlayer也可以象这样来定义:

    class GamePlayer {

    private:

        enum { NUM_TURNS = 5 }  // "the enum hack" — makes

        // NUM_TURNS a symbolic name

        // for 5

        int scores[NUM_TURNS];// fine

    };

    除非你正在用老的编译器(即写于1995年之前),你不必借用enum。

    综合上面的情况,为了能够兼容老的编译器,同时为了能在类中确定数组的大小,可依以下顺序使用常量:

    首先考虑用enum;

    在定义类时声明静态常量,在实现类时初始化此常量;

    如果编译器允许,可以在定义类时初始化静态常量。

    -------------------------------------------------------end-------------------------------------------------------------

  • 相关阅读:
    【重学计算机】操作系统D5章:文件系统
    【重学计算机】操作系统D4章:设备管理
    【重学计算机】操作系统D3章:存储管理
    【重学计算机】操作系统D2章:处理器管理
    【重学计算机】操作系统D1章:计算机操作系统概述
    【重学计算机】计算机组成原理
    java 图片生成缩略图后,转化成流
    jquery textarea输入字符字数提示
    shell 脚本连接mysql数据库查询database中表的数量和表名
    Maven deploy时报Fatal error compiling: tools.jar not found错误的问题处理
  • 原文地址:https://www.cnblogs.com/wangkangluo1/p/2521193.html
Copyright © 2020-2023  润新知