【读书笔记】EffectiveC++ 2.构造/析构/赋值运算
规则5 了解c++默默编写并调用哪些函数
在什么都不声明的情况下。编译器可以为class自动创建default构造函数,而一旦你自己编写了构造函数,它将不会生成。如果你希望你的class作为基类存在或需要被某些容器装载,你需要手动增加一行 =default的构造函数。
如果不声明,编译器会自动提供copy构造函数和copy assignment操作符,但只能完成相对简单的赋值操作。
规则6 若不想使用编译器自动生成的函数,就该明确拒绝
接上文,编译器默认自动提供copy构造函数和copy assignment操作符,并将其声明为public。如果你不希望这样做,你可以手动提供一份private的copy构造函数和copy assignment操作符,这已经可以避免绝大多数情况下对于构造的错误调用。但如果你希望成员函数和友员函数、也不这么做,就需要创建一个专门的基类来做上面的行为,然后让你的类继承它。
规则7 为多态基类声明virtual析构函数
假如多态基类没有virtual析构函数,那么当你使用基类指针指向派生对象,并试图使用这个指针删除该对象时,派生类的析构函数将不会被调用。
规则8 别让异常逃离析构函数
析构函数中抛出异常会导致剩下的资源的没有被正确释放
规则9 绝不在构造和析构过程中调用virtual函数
因为此时调用的是基类的该virtual函数,而非你想要使用的派生类中的函数。
规则10 令operator=返回一个reference to *this
使用return *this 这是一个协议
规则11 在operator=中处理自我赋值
可以使用证同测试(this==&input)
总之需要保证可能需要同时操作两个相同对象的函数不出现问题
规则12 复制对象时勿忘其每一个成分
如果自己重新书写copy构造函数,那么记得确认是否真的复制了对象中的每个成员,因为编译器不会对其做任何检测。