条款01:视C++为一个语言联邦
? C
? Object-Oriented C++
? Template C++//泛型编程部分(generic programming)
? STL
C++高效编程守则视情况而变化,取决与你使用C++的哪一部分。
条款02:尽量以const, enum, inline替换#define
? 对于单纯常量,最好以const对象或者enums替换#defines。
? 对于形似函数的宏,最好改用inline函数替换#defines。
条款03:尽可能使用const
? 声明为const可帮助编译器侦测出错误用法。
? 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”。
? 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。
条款04:确定对象被使用前已先被初始化
? C++成员初始化次序是固定的,class的成员变量总是以其声明次序被初始化。但是它们可以在成员初值列中以不同的次序出现,没有影响。
? 构造函数中注意分清初始化操作和赋值操作。初始化是在成员初始化列表里面,而赋值是在构造函数本体里面进行的。
? 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。
? 为内置内型对象进行手工初始化,因为C++不保证初始化它们。
? 为免除“跨编译单元之初始化次序”问题,以local static对象替换non-local static对象。
条款05:了解C++默默编写并调用哪些函数
? 编译器为class暗自创建了default构造函数、copy构造函数、copy assignment操作符、以及析构函数。
条款06:若不想使用编译器自动生成的函数,就该明确拒绝
? 为拒绝使用编译器自动生成的函数,可以将相应的成员函数声明为private并且不予实现。或者使用想Uncopyable这样的base class也可以。在该类中把你想要拒绝的函数设置为private类型。
条款07:为多态基类声明virtual析构函数
? 带多态性质的base classes应该声明一个virtual析构函数 。如果class带有任何virtual函数,它就该拥有一个virtual 析构函数。
? Classes的设计目的如果不是作为base classes使用,或不是为了具备多态性,就不该声明为virtual析构函数。
条款08:别让异常逃离析构函数
? 析构函数绝对不要吐出异常,否则总会带来”过早结束程序”或”发生不明确行为”的风险。当然还会造成内存泄露。(比如删除vector<>)
? 如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们不传播或结束程序。
? 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。
条款09:绝不在构造和析构过程中调用virtual函数
? 由于base class构造函数的执行更早于derived class构造函数,当base class构造函数执行时derived class的成员变量尚未初始化。如果此期间调用的virtual函数下降到derived classes阶层,而derived class的函数必然取用local成员变量,而那些成员变量此时尚未初始化,将会导致不明确行为。
? 在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class。
条款10:令operator=返回一个reference to *this
? 令赋值(assignment)操作符返回一个reference to *this。