美文网首页
条款2:尽量以const,enum,inline 替换 #def

条款2:尽量以const,enum,inline 替换 #def

作者: 庄阿莫 | 来源:发表于2018-11-19 23:27 被阅读0次

    >>One

    问题情景

    当你使用一个宏(#define ASPECT_RATIO 1.653)作为报错信息时,你会得到1.653而不是 "ASPECT_RATIO" 这个报错信息而苦恼。这是由于 #define 不被视为语言的一部分,“ASPECT_RATIO”未进入记号表所导致的。

    怎么做

    以常量替换上述的宏:
    const double Error_AspectRatio = 1.653;

    为什么这么做

    • Error_AspectRatio进入记号表,报错信息会显示它,而不是1.653。

    • 使用常量时的目标码会比使用宏时的目标码少。

    注意

    • 如果你要把字符串常量放在头文件内时,最好使用cosnt_string:
      const std::string authorName("Scott Meyers");

    class GamePlayer {
    private:
        static const int NumTurns = 5;//此为常量声明式
        int scores[NumTurns];//使用该常量
    };
    

    如果你要取GamePlayer::NumTurns的地址,编译器又需要看到一个定义式,你必须提供给它:
    (由于它在声明时获得初值,因此不需要在定义时赋值)
    const int GamePlayer::NumTurns;

    >>Two

    问题情景

    上述代码中,如果编译器不允许在类内初始化 static成员变量。

    怎么做

    //示例一
    class GamePlayer {
    private:
        static const int NumTurns;//头文件内
        ...
    };
    const int GamePlayer::NumTurns = 5;//实现文件内
    

    或者

    //示例二
    class GamePlayer {
    private:
        enum { NumTurns = 5 };
    
        int scores[NumTurns];
    }
    

    为什么这么做

    1. 对于示例二
    • 如果你不想让别人获得一个指针或引用指向你的某个整数常量,enum可以帮助你。
    • 对于优秀的编译器,不会为常量分配内存空间。Enums 和 #define 一样,绝对不会导致非必要的内存分配。

    >>Three

    问题情景

    #define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
    在你被 #define 所导致的可读性问题困扰时,inline-template会帮助你。

    怎么做

    template<typename T>
    inline void callWithMax( const T& a, const T& b )
    {
        f( a > b ? a : b )
    }
    

    为什么这么做

    • 可读性提高。
    • 效率相同,并且拥有类型安全性。
    • 你可以做宏无法做到的事,比如,在template-class里面写 private inline 函数,得到封装性。

    相关文章

      网友评论

          本文标题:条款2:尽量以const,enum,inline 替换 #def

          本文链接:https://www.haomeiwen.com/subject/jfrzfqtx.html