為什么拷貝構造函數(shù)的參數(shù)類型必須是引用呢?先看如下代碼
<pre>#include <iostream>
class Foo{
public:
Foo();
Foo(const Foo&); //拷貝構造函數(shù)
}</pre>如果參數(shù)不是引用類型,則調(diào)用永遠不會成功,為什么?
我們先來看看什么情況下會發(fā)生拷貝初始化
<li><b>將一個對象作為實參傳遞給一個非引用類型的形參</b></li>
<li>將一個返回類型為非引用類型的函數(shù)返回一個對象</li>
<li>用花括號列表初始化一個數(shù)組中的元素或一個聚合類的成員</li>
注意第一條的內(nèi)容,如果拷貝構造函數(shù)的參數(shù)類型不是引用那么執(zhí)行調(diào)用的時候就永遠不會成功,如下所示
<pre>Foo instance1;
Foo instance2 = instance1; //調(diào)用拷貝構造函數(shù)</pre>顯然代碼是想用拷貝初始化的方式給instance2賦值為instance1,這條語句實際上是等價于執(zhí)行下面這條語句
<pre>Foo instance2(instance1); </pre>如果參數(shù)類型不是引用的話,那么調(diào)用這個函數(shù)(即拷貝構造函數(shù))必須拷貝實參,但為了拷貝實參,我們又必須調(diào)用拷貝構造函數(shù)(因為將一個對象作為實參傳遞給一個非引用類型的形參時會發(fā)生拷貝初始化),如此無限循環(huán),致使調(diào)用永遠不會成功。
<pre>Foo(const Foo&); //拷貝構造函數(shù),形參必須為引用類型
Foo(const Foo); //永遠無法成功</pre>