當你嘗試著把拷貝構造函數寫成值傳遞的時候,會發現編譯都通不過,錯誤信息如下:
error: invalid constructor; you probably meant 'S (const S&)' (大致意思是:無效的構造函數,你應該寫成。。。)
當編譯錯誤的時候你就開始糾結了,為什麼拷貝構造函數一定要使用引用傳遞呢,我上網查找了許多資料,大家的意思基本上都是說如果用值傳遞的話可能會產生死循環。編譯器可能基於這樣的原因不允許出現值傳遞的拷貝構造函數,也有可能是C++標准是這樣規定的。
如果真是產生死循環這個原因的話,應該是這樣子的:
#include<iostream>
using namespace std;
class S
{
int a;
public:
S(int x):a(x){}
S(const S st){this->a=st.a;}//拷貝構造函數
};
int main()
{
S s1(2);
S s2(s1);
return 0;
}
當給s2初始化的時候調用了s2的拷貝構造函數,由於是值傳遞,系統會給形參st重新申請一段空間,然後調用自身的拷貝構造函數把s1的數據成員的值傳給st。當調用自身的拷貝構造函數的時候又因為是值傳遞,所以。。。
也就是說,只要調用拷貝構造函數,就會重新申請一段空間,只要重新申請一段空間,就會調用拷貝構造函數,這樣一直下去就形成了一個死循環。
所以拷貝構造函數一定不能是值傳遞。
作者 c小加