之前,我们说过构造函数在对象定义时调用,完成对象数据成员的初始化工作。
其实,拷贝构造函数是构造函数的重载形式。
拷贝构造函数是 利用一个已经存在的对象在生成一个新的对象。这种初始化的方式需要调用拷贝构造函数,若不定义拷贝构造函数,系统会自动生成默认的拷贝构造函数,把已经存在的对象的数据按位复制到新生成的对象的空间,但这种做法有时会出现问题。(往往在析构的时候会出现问题)。
一.拷贝构造函数特点
1.参数只有一个且必须使用引用传参,若使用传参形式会出现无穷递归调用(见下代码)
class Date
{
public:
Date(Date d)//传参形式
{
_year=d._year;
_month=b._month;
}
private:
int _yaer;
int _month;
};
以上是传参形式,会产生递归拷贝构造,编译不通过。原因是在传参时,会调用拷贝构造生成临时变量,而在拷贝构造里调用拷贝构造就相当于套娃,会产生递归,再次声明禁止套娃!!!
注意:拷贝构造函数定义在类内在调用时更加方便。
解决办法 传引用(加const 只读)
Date(const Date& d)
{
_year=d._year;
_month=d._month;
}
在调用拷贝构造函数时
Date d1(2023,5);//构造
Date d2(d1);//拷贝构造
Date d3=d1;//拷贝构造
二.什么时候调用拷贝构造函数
1.对象进行初始化;
2.函数参数对象是类的对象。
3.函数返回值是类的对象。
浅拷贝和深拷贝:
如果在有动态空间开辟的类(栈类,顺序表,链表,队列)中,浅拷贝往往会出现问题。原因是浅拷贝只是单纯的按值复制,内存没有变化,在析构时,会将空间析构两遍(出现问题,导致崩溃)。