本博客记录Effective STL 的55个条约,方便大家记录与查找。
条约01: 视c++为联邦性语言
可以把c++ 看成4个次语言:
- c语言. c++毕竟是c语言的基础。包含了c语言的特性,比如数组,指针,等等。
- Object-Oriented c++. 这部分就是 c with Class,classes(构造函数与析构函数),封装,多态,继承,virtual函数
- Template. 模板元编程(TMP),也是c++的范型编程。
- STL. stl是template的库,它对容器、迭代器、算法、以及函数对象有紧密配合与联系。
所以说是联邦性语言,当你编程的时候,你所编程的东西,应该清楚记得属于那部分语言,有助于你使用。(个人看法)
条约02: 尽量以const,enum,inline 替换 #define
#define ASPECT_RATIO 1.653
替换为:
const double AspectRatio = 1.653;
#define 是预处理器处理的结果,编辑器是看不到结果的,在后期调试的时候会很浪费时间。
基本原因:你所使用的名称可能并没有进入记号表(symbol table)
接下来来看一个例子:
#include <iostream>
using namespace std;
#define CALL_WITH_MAX(a, b) ((a) > (b) ? (a):(b))
int main()
{
int a = 5, b = 0;
CALL_WITH_MAX(++a, b);
cout << "a = " << a << " b = "<< b<<endl;
a = 5, b = 0;
CALL_WITH_MAX(++a, b+10);
cout << "a = " << a << " b = " << b << endl;
return 0;
}
我们运行看结果:
a = 7 b = 0
a = 6 b = 0
请按任意键继续. . .
第一个a 居然加了两次, 第2个a只加了一次,这样去写完全结果不是我们想要的,与函数想表达的不一致。
所以替换为:
template<typename T>
inline void callWithMax(const T& a, const T &b)
{
a > b ? a : b;
}
这样我们就解决问题了。
所以记住:
- 对于单纯的常数,最好以const,enums,来替换#define
- 对于宏函数,尽量改为inline函数替换#define
条约03: 尽可能使用 const
- 将某些东西声明为const 可帮助编辑器侦测出错误方法:const int a = 3; if(a = b),这样就会报错
- 编辑器强制实施 bitwise constness,编写的时候应该使用“概念上的常量”
- 当const 与 non-const 等价的时候,non-const版本调用 const版本可避免代码重复