条款1.C++是一个语言联邦
过程形式(procedural)
面向对象形式(object-oriented)
函数形式(function)
泛型形式(generic)
元编程形式(metaprogramming)
NOTE:
C++有四个次语言:
1.C
no templates ,no exceptions ,no overloading...
2.object-oriented C++
class, encapsulation ,inheritance ,polymorphism ,virtual function...
3.template C++
template metaprogramming(TMP 模板元编程)
这块接触比较少!!!!
4.STL
containers, iterators,algorithms,function objects.
这块接触也比较少!!!
所以,C++高效编程守则视状况而定,取决于使用C++的那一部分。不过觉得,我暂时还考虑不到性能问题,先解决功能问题再说。
条款2:尽量以const ,enum,inline 替换#define(prefer consts,enums,and inlines to #defines)
其实也是,宁愿以编译器替换预处理器。#define 变量在preprocess时被替换掉了。最好让变量保留,编译器可以看到,为了让标识符进入
sysmbol table( 记号表)。
const double AspectRation = 1.653; //这样比#define AspectRation 1.653 更科学,易debugg问题。
对于const 替代 #define有2点:
1.常量指针:
const char* const authorName = "scott meyes";
cosnt std::string authorName ("scott meyes"); //貌似这个效果最好。暂时不知道原因???
2.class的专属常量:
class GamePlayer{
private:
static const int NumTurns = 5;//常量声明式 ,这个不懂,以前以为这种写法就是对变量的definition.这里为何只是declaration ???
int scores[NumTurns]; //使用该常量
....
};
const int GamePlayer::NumTruns;//NumTurns的定义
看到上面的code,有点闷了!!这个跟之前理解的变量的声明和定义完全反过来了。那到底如何区别变量的declaration/definition???
#define 是不可以控制作用域的,const可以。
也提到了enum hack 这个知识点。其实就是枚举一个标识符并赋值,当int 数据类型使用。
以上提到的都是简单的宏,对于宏参模式(看起来很像函数),用inline函数代替。
直接上例子了:
#define call_max(a,b) f((a)>(b)?(a):(b))
int a = 5 , b = 0;
call_width_max(++a,b);//a 被累加了2次
call_width_max(++a,b+10);//a被累加了1次
good code:
template<typename T>
inline void callwithmax(const T& a, cosnt T& b)//pass by reference to const
{
f(a>b?a:b);
}
consts , enums and inlines 使我们对预处理器的依赖性减低了。特别是#define,但#include,#ifdef/#ifndef仍然需要。
NOTE:
对于单纯变量,最好const 对象或enums 代替#defines
对于带参数的宏,最好用inline函数 代替#define .
一句话,尽量不要让预编译的code出现在你的代码中。想法替换掉。