看到了这本书,就随手拿来读一下。实际上,这本书讲的东西非常深,有些知识点很偏,有些讲解很晦涩。
其中所讲到的常见编程错误,有一些是C语言的遗留影响(比如使用空指针和类型转换,而不使用多态),有一些是临时实现功能所增加的补丁造成的,有一些是不了解现成的标准库或者算法而自己实现功能造成的效率、准确性或者安全性降低(重复造轮子)。在实际工作中,即使是在经验丰富的工程师所编写的代码里,也常常会见到类似的错误。我自己就在工作中改进了一些做法。
记录一些笔记如下:
1、位屏蔽算法:
typedef unsigned short Bits;
inline Bits repeaded(Bits b, Bits m){
return b & m & (b & m) - 1;
}
...
if(repeaded(options, 0XFF00))
cerr << "Too many options selected.";
2、成员类型转换符:
class C{
operator int *() const;
};
3、常用的与C相关缩写
POD-Plain old data, a C struct-和C语言兼容的结构
POF-Plain old function, a C function-和C语言兼容的函数
RVO-Return value optimization-返回值优化
NRV-Named RVO-具名的返回值优化
Ctor-Constructor-构造函数
Dtor-Destructor-析构函数
4、注意运算符优先级;不要过度重载运算符
5、函数对象封装计数:
class ExecBump{
public:
void operator()(void (*func)()){
func();
++count_;
}
int get_count(){
return count_;
}
private:
static int count_;
};
6、常用的跨平台写法:
#ifdef PLATFORM_A
...
#endif
这种写法并不是平台无关的,只是多平台相关的。
7、尽量不要用强制静态类型转换;尽量不要用在类中增加类型标识信息的方法来处理。优先采用多态设计。尽量保持基类对派生类一无所知。
8、不要过度使用异常。
9、常用的锁结构:
class MyLock{
public:
MyLock(){ lock(); }
~MyLock(){ unlock(); }
};
void doSth(){
MyLock my_lock;
...
}
这样在离开作用域时,my_lock析构,一定会解锁。
10、构造函数和析构函数中不要调用虚函数。不要有虚赋值运算符存在。
11、构造函数不能为虚;析构函数最好为虚。
12、使用mutable修饰词。