Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

readme.md

条款05: 了解C++默认编写并调用哪些函数

如果你没有声明, 那么C++会为你自动创建一些成员函数, 这些函数包括: 默认构造函数, copy构造函数, 析构函数和copy assignment操作符.

如果你有自己定义任意一个构造函数, 则编译器便不会为你自动生成默认构造函数.

如果你有自己定义一个copy构造函数, 析构函数或者copy assginment操作符, 那么编译器也将不会自动生成它们的默认版本.

编译器自动生成的成员函数的特点

  • 自动生成的默认构造函数不接收任何参数, 且函数体为空. 其主要作用是为一些"幕后"的代码提供"藏身之处", 比如调用基类以及non-static数据成员的构造函数.
  • 自动生成的析构函数同样不接收任何参数, 且函数体为空, 其主要作用也是为一些"幕后"的代码提供"藏身之处", 比如调用基类以及non-static数据成员的析构函数. 注意, 该析构函数不会被virtual所修饰, 所以仅当该类的基类具有virtual析构函数时, 本类的自动生成的析构函数才具有virtual属性.
  • 自动生成的copy构造函数和copy assignment操作符, 仅仅是将来源对象的每一个non-static数据成员拷贝到目标对象(浅拷贝). 因此如果浅拷贝无法正确完成工作, 应该手动提供执行深拷贝的copy构造函数和copy assignment操作符.

几种编译器无法自动生成copy assignment操作符的的情况

  • 某个数据成员是reference to sth.
  • 某个数据成员被声明为const.
  • 基类中的copy assignment操作符被声明为private. (同样的情况发生在基类的copy构造函数上也会导致编译器无法自动生成copy构造函数)

总结

  • 编译器可以暗自为class创建default构造函数, copy构造函数, copyy assignment操作符, 以及析构函数.