一、c++默认编写了哪些函数
copy构造函数、一个copy assignment操作符和一个析构函数、default构造函数。
当这些函数被需要时,它们才会被编译器创建出来。
注意:编译器产出的析构函数是个non-virtual,除非这个class的base class自身声明有virtual析构函数(这种情况下这个函数的虚属性virtualness主要来自base class.)。
二、这些函数做了哪些操作
- copy构造函数和copy assignment操作符:将来源对象的每一个non-static成员变量拷贝到目标对象(浅拷贝)
- default构造和析构函数:调用base classes和non-static成员变量的构造函数和析构函数。
三、编译器什么时候不会生成默认的构造和复制函数
- 如果声明了构造,则编译器不会再生成默认构造,但会生成复制函数和析构函数(如果它们被调用)。
- 当class内包含reference或const修饰的成员变量,则编译器不会生成copy assignment操作符。因为reference一经初始化便不可再修改,而const也不允许再修改。
- base class中的copy assignment是private的,则编译器不会在生成copy assignment。因为derived classes中的copy assignment会调用base class中的copy assignment来赋值base class中的成分。但是base class 中的copy assinment是私有的。