为什么拷贝构造函数的参数类型必须是引用呢?先看如下代码
<pre>#include <iostream>
class Foo{
public:
Foo();
Foo(const Foo&); //拷贝构造函数
}</pre>如果参数不是引用类型,则调用永远不会成功,为什么?
我们先来看看什么情况下会发生拷贝初始化
<li><b>将一个对象作为实参传递给一个非引用类型的形参</b></li>
<li>将一个返回类型为非引用类型的函数返回一个对象</li>
<li>用花括号列表初始化一个数组中的元素或一个聚合类的成员</li>
注意第一条的内容,如果拷贝构造函数的参数类型不是引用那么执行调用的时候就永远不会成功,如下所示
<pre>Foo instance1;
Foo instance2 = instance1; //调用拷贝构造函数
</pre>显然代码是想用拷贝初始化的方式给instance2赋值为instance1,这条语句实际上是等价于执行下面这条语句
<pre>Foo instance2(instance1); </pre>如果参数类型不是引用的话,那么调用这个函数(即拷贝构造函数)必须拷贝实参,但为了拷贝实参,我们又必须调用拷贝构造函数(因为将一个对象作为实参传递给一个非引用类型的形参时会发生拷贝初始化),如此无限循环,致使调用永远不会成功。
<pre>Foo(const Foo&); //拷贝构造函数,形参必须为引用类型
Foo(const Foo); //永远无法成功
</pre>