Effective C++ 笔记2(构造,析构,赋值)
条款5:了解C++默默编写并且调用了哪些函数
1、 构造函数,析构函数,拷贝赋值函数,拷贝构造函数。
class Empty { public: //默认构造函数 Empty(){}; //拷贝构造函数 Empty(const Empty& rhs){} //析构函数 ~Empty(){} //拷贝赋值函数 Empty& operator=(const Empty& rhs){}; }; //默认构造函数 Empty e1; //拷贝构造函数 Empty e2(e1); //拷贝赋值函数 Empty e3=e1;
2、 类中包含引用的时候无法进行一般的赋值操作,必须自己定义拷贝赋值操作符
条款6:若不想使用编译器自动生成的函数就应该明确拒绝
1、 声明为private可以阻止(单不绝对安全,member函数和friend函数还可以调用)
class Empty { public: //默认构造函数 Empty(){}; //析构函数 ~Empty(){} private: //拷贝构造函数 Empty(const Empty& rhs){} //拷贝赋值函数 Empty& operator=(const Empty& rhs){}; };
2、 声明一个uncopyable的基类,再继承它
class Empty:private Uncopyable { public: //默认构造函数 Empty(){}; //析构函数 ~Empty(){} }; class Uncopyable { public: //默认构造函数 Uncopyable(){}; //析构函数 ~Uncopyable(){} private: //拷贝构造函数 Uncopyable(const Uncopyable& ){} //拷贝赋值函数 Uncopyable& operator=(const Uncopyable& ){}; };
条款7:为多态基类声明virtual析构函数
1、 基类的析构函数要加virtual,防止delete的时候局部销毁
2、 不是基类别就不需要
条款8:别让异常跳出析构函数
1、 析构函数在处理的时候一定要加上try catch
2、 如果需要对异常进行反应,则把处理写成一个普通的方法处理,加上标志位,运行正常后再在析构函数中处理
条款9:绝不在构造函数和析构函数中调用virual函数
条款10:令operator= 返回一个reference to *this
1、 class& operator=(){return *this}
条款11:在operator=中处理自我辅值
1、确定在一个函数中包含2个对象的时候,这两个对象是同一个对象的情况下是否正确
条款12复制对象时勿忘记其每一个成分
1、