effective C++读书笔记(二)

社会主义新天地 提交于 2019-12-23 03:29:15

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构造函数,一定要记得复制每个成员变量,因为漏了编译器也不会告诉你

  • 特别是有父类时,自己写的复制构造函数可能看似复制了每个成员,但漏了父类成员。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!