条款01:视C++为一个语言联邦
将C++视为一个由相关语言组成的联邦而非单一语言。
- C
- Object-Oriented C++
- Template C++
- STL
条款02:尽量以 const,enum,inline 替换 #define
- #define所使用的名称可能并未进入symbol table,调试增加困难
- #define不重视作用域,不能提供封装性,无法利用#define创建一个class的专属常量
- #define实现宏很容易出错,建议用template<> inline代替
条款03:尽可能使用const
const 成员函数
bitwise const 以及 logical const,这部分较为复杂,查看书籍深入理解。
在const 和 non-const成员函数中避免重复
当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复
条款04:确定对象被使用前已先被初始化
- 为免除’跨编译单元初始化次序’问题,以local static对象代替non-local static对象
假设有一单一文件系统类
假设客户建立了一个class以处理文件系统内的目录,很自然他们的class会用上tfs对象
客户决定创建一个Directory对象,用来放置临时文件
Directory tempDir(params); //为临时文件
除非tfs在tempDir前被初始化,否则tempDir就会用到尚未初始化的tfs。但是tfs和tempDir由不同的人在不同的时间于不同的源码文件内建立起来,如何确保tfs会在tempDir前先被初始化呐?
可以将每个non-local static对象搬到自己专属函数内,这些函数返回一个reference指向它所含的对象,换句话说non-local static对象被local static对象替换了,这也是Singleton模式的常见手法
这种方法很好的解决static对象初始化顺序问题
但是因为内含static对象,使得在多线程系统中带有不确定性,再说一次,任何一种non-const static对象,不论是local还是non-local,在多线程环境下等待某事发生都会出问题
引用
Effective C++改善程序与设计的55个具体做法(第三版)