为什么类的拷贝构造函数的参数必须是引用(解决方法来源与
CSDN
)
(1)
我首先想如果传值为什么不可以呢,传值可以完成所有的数据成员的复制工作啊。原因在与这个函数本身是个拷贝构造函数,是用来初始化别的新的对象的。
例如:
T& operator=(T t);
那么我们调用
T t1;
T t
(
t1
)
;
时,拷贝构造函数被调用,
当我们传值
t1
的时候,我们在函数里面操作的都是一个临时的对象,要在运行栈里面复制一个副本
t2
,但是这个临时对象的创建也要调用自身这个拷贝构造函数,因此在上面的那个拷贝构造函数的第一次调用内部又再一次调用自身:
T t(t1)
{ //
伪代码
T t2(t1);
//
从这里才是开始用户定义的其他的复制工作
}
T t2=t(t1).
来产生函数里面的对象副本
t2,
这就导致了一个死循环,
t2
的构造过程中又要调用自身这个拷贝构造函数:
就像下面的情况:
T t(t1)
{ //
伪代码
T t2(t1)
{//
这里也是先调用本身拷贝一个副本
t3
:
T t3(t1)
{//
再调用本身拷贝一个副本
t4;
……………………
//
从这里才是开始用户定义的其他的复制工作
}
这样看来,调用要无止境了,所以是不能传值的
第一个问题解决;
(2)我又想可以传指针啊,但是传指针是没有传引用方便和直观的
但是这样用就麻烦了
例如:class T;
T t1;
如果拷贝构造函数传指针那就要这样调用:
T t2(&t1);
现在只要这样就可以:
T t2(t1);
由于赋值符的重载的实际上跟拷贝构造函数是一样的,此时更明显了
T t2=&t1;
T t2=t1;哪个方便,当然是第二种。
至此,第二个问题解决;