拷贝构造函数是什么?
拷贝构造函数是用来定义 同类型的另一个对象初始化本对象时,所做的工作。
它的函数写法是
class F{
public:
F(const F&){};
}:
如果没有定义拷贝构造函数,编译器会定义默认的合成拷贝构造函数。
拷贝赋值运算符:
定义将一个对象赋值给同类型的另一个对象时,所做的类所做的工作。
operator=
class F{
public:
F& operator=(const &F);
}:
本质其实是函数。
如果没有定义拷贝赋值运算符,编译器会定义默认合成拷贝赋值运算符。
析构函数:
class F{
public:
~F();
}
是用来定义对象被删除时所做的工作。
构造函数是用来初始化所有非static成员的。
而析构函数是用来销毁对象的所有非static成员。
析构函数的特点:
不能被删除,不能被重载,(要是删除析构函数,就无法销毁对象,对象永远保存在内存中,浪费系统资源)。
当变量离开作用域,调用析构函数;
当一个对象被销毁时,调用析构函数;
当一个容器被销毁时,调用析构函数;
当一个动态分配的对象调用delete时,调用析构函数;
临时对象被销毁时,调用析构函数。
析构函数一般没有函数体,只有当需要阻止成员被销毁时,需要定义函数体。
如果有析构函数,那么就必须定义相应的拷贝构造函数、拷贝赋值运算符。
如果一个类需要一个拷贝构造函数,那么这个类也一定需要一个拷贝赋值运算符。
=default
将类的成员定义为=default,意味着不用拷贝构造函数,而是显示的要求编译器生成合成拷贝构造函数。
只能对默认的拷贝构造函数使用=default。
=delete
删除函数。这个是为了阻止使用拷贝构造函数而定义的。因为如果不阻止拷贝构造函数,编译器就会调用合成拷贝构造函数,还是会调用,将构造函数定义为删除的,就能够阻止所有的构造函数初始化成员。
删除函数是一种声明了的、但不能使用的函数。
可以指定任何函数为删除的。
除了析构函数之外、、、、要是析构函数也被删除就无法释放被占用的内存!