简单来说,如果使用值传递,会出现一个无限循环,并最终出现错误。
举个例子:一个类为temp,假设拷贝构造函数为值传递:
temp (const temp C)
{
...
}
temp A; //生成了一个temp类的对象
temp B = A; //将会调用拷贝构造函数
此时,B需要调用其拷贝构造函数,需要将A进行值传递进入B的拷贝构造函数,而在进行值传递时,B的拷贝构造函数会生成一个该类的临时对象(假设为C),会执行temp C=A(初始化形参,也就是初始化函数的局部变量),这又将调用C的拷贝构造函数,将A以值传递的方式传入…如此往复,每一次都会产生新的对象,从而耗尽资源,产生错误。
而引用传递为什么不会有这个问题呢?
假设拷贝构造函数为:
temp (const temp &C)
{
...
}
temp A;
temp B = A;
此时,当上述B调用拷贝构造函数时,会生成一个临时的引用变量,而不是对象,会执行temp &C=A(同样是初始化形参,只不过是初始化一个引用),这不会产生新的对象,也就不会调用拷贝构造函数,只是增加了一个指向A的临时引用而已。