>>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];
}
为什么这么做
- 对于示例二
- 如果你不想让别人获得一个指针或引用指向你的某个整数常量,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 函数,得到封装性。