拷贝构造函数
第一个参数必须是引用类型。原因:如果参数不是引用类型 在调用拷贝构造函数时,一定会拷贝它的实参,如果要拷贝实参就必定会调用它的拷贝构造。那就会这样无限循环下去。
拷贝构造函数调用的时期:
1.用“=”定义变量
2.将一个对象作为实参传递给一个非引用类型的形参
3.从一个返回值类型为非引用类型的函数返回一个对象
4.{} 列表初始化一个数组中的元素或一个聚合类中的成员
析构函数
不接收参数,不能被重载
按初始化顺序的逆序销毁
释放对象在生存期分配的所有资源
需要析构函数的类也需要拷贝和赋值函数
需要拷贝操作的类也需要赋值操作,反之亦然
用=default 要求编译器生成合成版本
用=delete 来阻止函数使用(构造、析构、拷贝、赋值、移动拷贝、移动赋值)
=delete必须出现在函数第一次声明的时候
正常情况下析构函数不能是=delete的,因为这样类对象就没法释放了
如果一个类有数据成员不能默认构造、拷贝、复制或销毁,则对应的成员函数将被定义为=delete
编译器将合成成员定义为删除函数发生在以下情况下:
1.类中某个成员的析构函数是=delete的或private的,则该类的合成析构函数、默认构造函数、合成拷贝构造函数 为=delete
2.类中某个成员的拷贝构造函数是=delete的或private的,则该类的合成拷贝构造为=delete
3.如果类内有引用或const成员且没有类内初始化,且默认构造函数没有=default,则默认构造函数为=delete
=运算符通常组合了析构函数和构造函数的操作