5. 编译器会为class自动创建default构造函数,copy构造函数,重载运算符‘=’为copy构造函数,以及析构函数。
- 自动创建的copy构造函数和‘=’所做的事:将非static成员变量一一拷贝给新对象。
6. 如果不希望对象能够被默认的构造函数copy,例如有些class的对象都比较独特,可以自己将copy构造函数和‘=’声明为private,这样一旦复制操作被误调用,编译器就会报错。
- 如果父类进行了上述操作,子类则不再需要,即编译器也会阻止子类复制构造函数被调用。
7. 为多态父类声明virtual析构函数
这么做的原因:
- 当用父类指针指向子类对象时, 例如 base *p = (base *)new derived(); ,由于这个对象存在堆内存需要用delete p来释放内存,但如果父类此时的析构函数不为virtual,则delete操作只会调用父类的析构函数而使得子类的数据不能得到完全回收。
8. 别让异常传出析构函数
9. 不在构造函数和析构函数中调用虚函数
- 构造函数中的虚函数并不会调用子类的函数,依然是父类。
- 同样在子类对象调用析构函数时,父类的析构函数会视该对象为父类对象,即析构函数这里并不会发生多态。
10. 让operator返回本对象*this
- 这样可以让(student a = b)这样的表达式的值仍然为对象b,使得c = a = b连锁赋值变得合法。
- 同理,+,-,+=等等也可以这样做。
11. 注意在复制构造函数中避免自我赋值
- 若赋值之前释放资源,例如成员指针变量先delete再赋值,而传进来的对象就是自己的话,这个指针指向的内容就相当于永远被释放了。
- 可以在复制构造函数最开始检测传入对象的地址和this指针是否相等。
- copy and swap
12. 如果自己写copy构造函数,一定要记得复制每个成员变量,因为漏了编译器也不会告诉你
- 特别是有父类时,自己写的复制构造函数可能看似复制了每个成员,但漏了父类成员。
来源:CSDN
作者:Willowwww
链接:https://blog.csdn.net/Willowwww/article/details/103645689