条款1,C++不仅仅是一C语言加入了面向对象特性的高级语言。
发展到现在C++可被称为多重泛型编程语言,一个同时支持过称形式,面向对象形式,函数形式,泛型形式,元编程形式de语言。
如果要正确理解C++,最好将其视为一个语言联邦。该联邦由4个子语言模块组成。
C,Object-Oriented C++,Template C++,STL.具体内容根据字面意思大体了解即可。只有一点值得注意,迭代器和函数对象都是在C指针之上塑造出来的,所以对STL的迭代器和函数对象而言,旧式的C pass-by-value守则再次适用。
PS:高效编程守则视状况而变化,取决于你适用C++哪一部分。
条款2,尽量以const,enum,inline替换#define
该条款或许可以改为“宁可以编译器替换预处理器”,或许因为#define不被视为语言的一部分。
之前:#define ASPECT_RATIO 1.653 预处理器盲目将宏名称ASPECT_RATIO替换为1.653可能导致目标码出现多份1.653
之后:const double AspectRatio =1.653 这样不会出现。
Class GamePlayer{
private:
static const int NumTurns = 5;
int scores[NumTurns[;
}
1.首先#define 无法创建一个class专属常量,因为#define不重视作用域,且不提供任何封装性,如private #define
2.NumTurns只是声明式,而不是定义式。两种情况要有定义式。a,取某个class专属常量的地址,b,编译器(不正确地)坚持要看到一个定义式。
此时,要在实现文件,而非头文件中加入 const int GamePlayer::NumTurns;
3.inclass 初值设定,只允许对整数常量进行。如果编译器不支持上述语法,可以将初值放在定义式。
class CostEstimate{
private:
static const double FudgeFactor;
}
const double ConstEstimate::FudgeFactor = 1.35.
如果编译器(错误地)不允许“static整数型class常量”完成“inclass初值设定”,可改用“the enum hack”补偿做法。
理论基础是:“一个属于美剧类型的数值,可权充ints被使用”,于是:
class GamePlayer{
private:
enum{NumTurns = 5};
int score[NumTurns];
}
同时要知道对#define 和 enum取地址不合法。
如果不想让别人活得一个pointer或reference只想你的某个整数常量,enum可以实现。不会导致非必要的内存分配。
enum hack是template metaprogramming模板元编程的基础技术。
#define CALL_WITH_MAX(a, b) f(a>b?a:b)
int a = 5, b = 0;
CALL_WITH_MAX(++a, b) a被累加2次
CALL_WITH_MAX(++a, b+10) a被累加1次
template<typename T>
inline void callWithMax(const T &a, const T &b)
{
f(a>b?a:b)
}
PS:1.对于单纯常量,最好以const对象或enum替换#define
2.对于形似函数的宏,最好改用inline函数替换#define