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

>>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
inline void callWithMax( const T& a, const T& b )
{
    f( a > b ? a : b )
}

为什么这么做

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

你可能感兴趣的:(条款2:尽量以const,enum,inline 替换 #define)