reading 《Effective C++》
侯杰(译)
注释:斜体表示不理解的内容
第一章:让自己习惯c++
Item1:视c++为语言联邦(federation of languages)
c++的组成:
1. C语言:基础语法与内置类型;
2. objective-oriented c++:类及相关属性;
3. template c++:泛型编程;
4. STL:标准模板库中的containers、iterators、algorithms及function objects等。
总结:函数参数传递时:pass-by-value < pass-by-reference < pass-by-reference-to-const
Item2:尽量以const、enum、inline替换#define的使用
总结:对于单纯的常量,尽量以const、enum代替#define
对于形式函数的宏(macros),最好用inline函数替换#define
Item3:尽量使用const提高效率
总结:尽量使用const可以帮助编译器检测出错误的用法;用const可以是函数接口更加明显;当const与non-const有实质性的等价时,可以用non-const调用const函数。
Item4:确定对象使用之前已经被初始化
1. 内置类型的初始化;
2. 类内的内置类型的初始化:一般在构造函数处初始化,在构造函数处用成员初始列初始化,而非在构造函数中以赋值的形式初始化。初始化顺序尽量与声明时的顺序一致。
3. *为了避免跨编译单元的初始化,用local-static对象替换non-local-static对象。*
第二章:构造/析构/赋值运算(constructors/destructors/assignment operators)
Item5:了解C++默默编写并调用了哪些函数
总结:c++构造了类之后,会默认构造一个copy构造函数、一个copy赋值操作符、一个析构函数。这些函数军事public且inline的。
Item6:若不想编译器自动生成的函数,则应该明确的拒绝
总结:将copy构造函数与copy赋值操作符声明为private并且不予实现。
Item7:为多态基类声明virtual析构函数
总结:有多态性质的基类应该有virtual析构函数;如果设计的类不是用于基类,那么久不应该声明virtual析构函数。
Item8:别让异常逃离析构函数
总结:1.析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们并且结束程序;
2.如果要对某个函数执行期间抛出的异常做出反应,那么class应该提供一个普通函数执行该操作,而不是在析构函数中执行该操作。
Item9:绝不在构造和析构过程中调用virtual函数
因为这类虚函数的调用绝不下降至派生类中。
Item10:令operator=返回一个reference to *this
Item11:在operator=中处理“自我赋值”
1.确保当对象自我赋值时operator=的良好行为。其中的技术包括比较:
①对象来源与目标对象的地址;
②精心周到的语句顺序;
③copy-and-swap
2.确保任何函数操作一个以上的对象时,而其中的多个对象是一个对象时,其行为仍然正确。
Item12:复制对象时,不要忘记其每个部分
copying性质的函数应该确保复制对象内的所有成员变量,基于其base class成分。