拷贝构造函数就是用一个已创建好的对象去初始化另一个对象,我们用一个案例去说明:
#include <iostream>
using namespace std;
class example
{
public:
example(int a)//构造函数
{
this->num=a;
}
example(example &exp)
{
this->num=exp.num;
}
int num;
};
int main()
{
example exp1(10);
cout<<"exp1.num:"<<exp1.num<<endl;
example exp2(exp1);
cout<<"exp2.num:"<<exp2.num<<endl;
system("pause");
return 0;
}
我们注意到拷贝构造函数中我们采用了传址的方式:
example(example &exp)
{
this->num=exp.num;
}
?那我们可不可以改成传值的方式呢?
example(example exp)
{
this->num=exp.num;
}
答案是不可以的,系统会直接报错,那么不能传值的原因是啥呢?
????????我们继续用上面的案例去解释,假如我们用exp1按照传值的方式去初始化exp2,系统需要将exp1拷贝为另一个对象copy1,再用copy1的值去初始化exp2。exp1如何拷贝成copy1呢,需要调用拷贝构造函数,示意图如下:
? ? ? ? 它这里调用拷贝构造函数,用exp1去?初始化copy1,就需要先将exp1复制成copy2,再用copy2去初始化copy1,示意图如下:
?这样就会陷入一个无限套娃,先有鸡还是先有蛋的问题,因此拷贝构造函数不允许传值操作。
?
|