《Effictive C++》读书笔记 2

构造/析构/赋值运算

5.了解C++默默编写并调用了哪些函数(Know what functions C++ sliently writes and calls)

    default构造函数,default copy构造函数,copy assignment操作符以及析构函数。

6.若不想使用编译器生成的默认函数,就该明确拒绝(Explicitly disallow the use of complier-generated functions you do not want)

    将相应的成员函数设为private并不予实现可以实现该目的。也可以使用Uncopyable这样的base class来达到同样的目的。

7.为多太基类声明virtual析构函数(Declare destructors virtual in polymorphic base classes)

    polymorphic base classes应该将其析构函数声明为virtual,以保证其派生类的析构过程是正确的。不作为base class或者不具有多态性质的类的析构函数不应被声明为virtual,因为这样会带来不必要的开销。

8.别让异常逃离析构函数(Prevent expections leaving from destructors)

    析构函数不应抛出异常,否则可能会造成资源泄露或程序行为不确定。如果析构函数调用了某个会抛出异常的函数,那么析构函数应该捕捉并吞下它,或者结束程序。

9.绝不在构造或析构过程中调用virtual函数(Never call virtual function during construction and destruction)

    对象在构造或析构过程中,其类型在一定时间内会上升为base class,此时所调用的virtual函数绝不是所期望的版本。这会引发错误。

10.令operator= 返回一个 reference to *this(Have assignment operators return a reference to *this)

    no why,一般性规则。同时 operator+=, operator-=...等也需要返回一个reference to *this。

11.在operator = 中处理自我赋值(Handle assignment to self in operator=)

    保证operator=在自我赋值时行为正确。可通过比较对象地址,精心安排程序语句顺序或copy-and-swap技术来实现。

    保证任何函数在操作一个以上的对象时,其中有几个对象其实是同一个对象时,程序行为正确。

12.复制对象时不要忘记每一个成份(Copy all parts of an object)

    复制对象时保证其所有的部分及基类的部分都被正确的复制了。

    不要尝试用一个Copying函数去实现另一个Copying函数(指copy构造函数及copy assignment操作符)。抽取其共同部分放入第三个函数,然后分别调用。

猜你喜欢

转载自www.cnblogs.com/lc19890709/p/9184711.html