概念
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:
1. 通过使用另一个同类型的对象来初始化新创建的对象。
2. 复制对象把它作为参数传递给函数。
3. 复制对象,并从函数返回这个对象。
--
同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或者拷贝是完全可行的。
这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。
在建立对象时可用同一个类或者另外一个对象来初始化该对象的存储空间,这时所用的构造函数是拷贝构造函数(Copy Constructor)。
调用拷贝构造函数的情形
1. 一个对象作为函数参数,以值传递的方式传入函数体;
# 对象作为函数参数,以值传递的方式传入函数体
class Complex
{
};
void Fun(Complex c)
{
}
int main()
{
Complex cc(1, 2);
Fun(cc);
}
2. 一个对象作为函数返回值,以值传递的方式从函数返回;
一个对象作为函数返回值,以值传递的方式从函数返回;
Complex Fun()
{
Complex cc(10, 20);
return cc;
}
3. 一个对象用于给另外一个对象进行初始化(常称为赋值初始化)
# 一个对象用于给另外一个对象进行初始化(赋值初始化)
int main()
{
Complex c1(1, 2);
Complex c2(c1);
}
当对象的成员变量存在指针变量时,用存在的对象初始化新建对象时指针变量一同初始化,但这时调用一般拷贝构造函数(浅拷贝)会使新对象中的指针指向和初始化对象指针指向一致,那么当用来初始化的对象在释放内存时会释放掉指针指向的内存,而当新创建的对象释放时会出现程序错误,以为这个指针指向的内存被释放了两次。因此我们需要手动提供另一种拷贝构造函数(深拷贝)。