Item05:了解C++默默编写并调用哪些函数
Konw what functions C++ silently writes and calls
编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符,移动构造函数,移动赋值运算符(C++11)。
Item06:明确拒绝自动生成的函数
Explicitly disallow the use of compiler-generated functions you do not want
- 可将相应的成员函数声明为private且不予实现。
- 通过在函数声明后加 =delete 来阻止该函数调用。
Item07:为多态基类声明virtual析构函数
Declare destructors virtual in polymorphic base classes
- 避免诡异的对象(局部销毁)而引发内存泄露,数据结构败坏。
- 当成员全为内置类型,且class不含virtual时,不必要令其析构函数为virtual,因为vptr也会占用空间。
Item08:别让异常逃离析构函数
Prevent exceptions from leaving destrucotrs
析构函数绝不要吐出异常。
- 如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏,数据库连接未关闭等问题。
- 通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。
Item09:绝不要在构造或析构中调用virtual函数
Never call virtual functions during construction or destruction
在构造和析构期间不要调用virtual函数,因为这类调用不下降至derived class(即无多态性)
Item10:令operator=返回一个reference to *this
Have assignment operation return a reference to *this
令赋值操作符返回一个引用。
Item11:在operator=处理自我赋值
Handle assignment to self in operator=
确保对象自我赋值时有良好的行为(复制前别删除)。
Item12:复制对象勿忘其每一个成分
Copy all parts of an object
- 复制所有的local成员变量
- 调用所有base classes内的适当copying函数
- 深浅复制控制好