天天看点

Effective C++笔记

  1. C++仍是以C为基础;Object-Oriented C++,classes(包括构造函数和析构函数),封装(encapsulation)、继承(inheritance)、多态(polymorphism);Template C++,泛型编程;STL是Template程序库。

2. 对于单纯常量,最好以const对象或enums替换#defines

3. const出现在星号左边,表示被指物是常量;新号右边,表示指针自身是常量;星号两边,表示被指物和指针两者都是常量

4. 对象的成员变量的初始化动作发生在进入构造函数本体之前

a. 为内置型对象进行手工初始化,因为C++不保证初始化他们

b. 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列出的成员变量,其排列次序应该和它们在class中声明的次序相同。

c. 为免除"跨编译单元之初始化次序"问题,请以local static(对象静态成员)对象替换non-local static(非对象静态成员的其他情况)对象

5. 编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数。为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class也是一种做法。

6. polymorphic(带多态性质的)base classes应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。Classes的设计目的如果不是作为base classes 使用,或不是为了具备多态性(polymorphically),就不该声明为virtual析构函数

7. 析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。

8. 在构造和析构函数期间不要调用virtual函数,因为这类调用从不下降至dervied class(比起当强执行构造函数和析构函数的那成)。

9. 令赋值(assignment)操作符返回一个referrence to *this。

10. 确保当对象自我赋值时operator=有良好行为。其中技术包括比较"来源对象"和"目标对象"的地址、精心周到的语句顺序、以及copy-and-swap。确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。

11. Copying函数应该确保赋值"对象内的所有成员变量"及"所有base class成分"。不要尝试以某个copying函数实现另一个copying函数。应该将共同将机能范进第三个函数中,并由两个copying函数共同调用。

令copy assignment操作符调用copy构造函数是不合理的,因为这就像试图构造一个已经存在的对象。反方向——令copy构造函数调用copy assignment操作符——同样无意义。