《Effective C++ 》阅读随笔 条款1 尽量以const、enum、inline替换#define

条款1、尽量以const、enum、inline替换#define

define ASPECT_RATIO 1.653 代替为

const double AspectRadio = 1.653;
好处:调试方便,编译器知道1.653的来源,而采用#define则无法知道

常量指针(常量定义通常放在头文件,以便被不同源码含入,因此需将指针声明为const),如
const char* const authorName = "Scott Meyers";
用string 代替char*-based更好
const std::string authorName("Scott Meyers");

class专属常量(限制常量的作用域(scope))
class GamePlyer{
private:
static const int NumTurns = 5; //常量声明式
int scores[NumTurns];
}
上述的常量是有声明,没有定义。通常C++要求你所使用的任何东西提供一个定义式,但是如果它是个class专属常量
且为static整型(integral type,如ints chars bools),则需特殊处理。如果不取地址,可以只声明无需定义,
如果取class专属常量地址,或者编译器(不正确的)坚持要看到一个定义式,你就要在class视线中提供定义式:
const int GamePlyer::NumTurns; //NumTurns的定义,声明已获得初始值,无需再提供
我们是无法使用#define创建一个class专属常量,因为#define不重视作用域(scope)

例外:某些编译器不支持声明时直接获得初值,则把初值放在定义式中
如果class编译期间需要一个class常量值,例如上述的数组声明式中,可以改用所谓的“the enum hack”补偿作法。
其理论基础是:一个属于枚举类型的数值可权充ints使用,因为可改为
class GamePlyer{
private:
enum {NumTurns = 5};// 令NumTurms成为5 的一个记号名称
int scores[NumTurns];
}
enum 与 #define类似,无法取地址,不会有内存分配

define函数:

define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))

出现以下意外:
int a = 5, b = 0;
CALL_WITH_MAX(++a, b); //a被累加两次
CALL_WITH_MAX(++a, b+10); //a被累加一次
调用函数之前,a被累加次数居然不一致(取决于被拿来和谁比较)
可以使用template inline代替:
template
inline void callWithMax(const T& a, const T& b){
f(a > b ? a : b);
}

请记住:
对于单纯常量,最好以const对象或者enums替换#define
对于形似函数的宏,最好改用inline函数代替#define

你可能感兴趣的:(《Effective C++ 》阅读随笔 条款1 尽量以const、enum、inline替换#define)