1. 程式人生 > >關於拷貝(複製)建構函式為什麼不能用值傳遞

關於拷貝(複製)建構函式為什麼不能用值傳遞

當你嘗試著把拷貝建構函式寫成值傳遞的時候,會發現編譯都通不過,錯誤資訊如下:
error: invalid constructor; you probably meant 'S (const S&)' (大致意思是:無效的建構函式,你應該寫成。。。)
當編譯錯誤的時候你就開始糾結了,為什麼拷貝建構函式一定要使用引用傳遞呢,我上網查找了許多資料,大家的意思基本上都是說如果用值傳遞的話可能會產生死迴圈。編譯器可能基於這樣的原因不允許出現值傳遞的拷貝建構函式,也有可能是C++標準是這樣規定的。
如果真是產生死迴圈這個原因的話,應該是這樣子的:

#include
<iostream>usingnamespace 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);


    
return0;
}
當給s2初始化的時候呼叫了s2的拷貝建構函式,由於是值傳遞,系統會給形參st重新申請一段空間,然後呼叫自身的拷貝建構函式把s1的資料成員的值傳給st。當呼叫自身的拷貝建構函式的時候又因為是值傳遞,所以。。。
也就是說,只要呼叫拷貝建構函式,就會重新申請一段空間,只要重新申請一段空間,就會呼叫拷貝建構函式,這樣一直下去就形成了一個死迴圈。
所以拷貝建構函式一定不能是值傳遞。