Rule 01: 视C++为一个语言联邦: 1. C
2. Object-Oriented C++
3. Template C++
4. STL
Rule 02: 尽量以const, enum, inline替换 #define
//宁可以编译器替换预处理器
/*
#define ASPECT_RATIO 1.653
const double AspectRatio = 1.653;
*/
/*
当我们以常量替换#define时,有两种情况:
1. 定义常量指针,必须写两次const,比如:
const char* const authoName = "Scott Meyers";
2. class专属常量
为了将常量的作用域限制于class内,你必须让它成为class的一个成员,比如:
class GamePlayer{
private:
static const int NumTurns = 5;
int scores[NumTurns];
...
};
or
理论基础:一个属于枚举类型的数值可权充ints被使用
class GamePlayer{
private:
enum{ NumTurns = 5};
int scores[NumTurns];
...
};
(如果你不想别人获得一个pointer或reference指向你的某个整数常量,enum可以帮助你实现这个约束。)
(enum和#define一样绝不会导致非必要的内存分配)
个人觉得enum在类里的应用比static const更好
*/
#include <iostream>
#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))
using namespace std;
template <typename T>
void f(T a)
{
cout << a << endl;
}
template<typename T>
inline void callWithMax(const T &a, const T &b)
{
f<T>(a>b?a:b);
}
int main()
{
int a = 5, b = 0;
CALL_WITH_MAX(++a, b);
cout << "a = " << a <<endl; // a被累加两次
CALL_WITH_MAX(++a, b+10) ;
cout << "a = " << a << endl; //a 被累加一次
cout << "b = " << b << endl; //b还是b
//a的累积次数竟然取决于 “它被拿来和谁比较”
int c = 5, d = 0 ;
callWithMax<int>(++c,d);
cout << "c = " << c << endl; //c被加一次
callWithMax<int>(++c, d+10);
cout << "c = " << c << endl; //c被加一次
cout << "d = " << d << endl;
//这样一个符合设计的本意,更合理
return 0;
}
//请记住:
// 对于单纯常量,最好以const对象或者enums替换#defines。
// 对于形似函数的宏(macros), 最好改用inline函数替换#defines。