關於拷貝(複製)構造函數爲什麼不能用值傳遞

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


如果真是產生死循環這個原因的話,應該是這樣子的:
 
  1. #include<iostream> 
  2. using namespace std; 
  3. class S 
  4.   int a; 
  5.   public
  6.   S(int x):a(x){} 
  7.   S(const S st){this->a=st.a;}//拷貝構造函數 
  8. }; 
  9.  
  10. int main() 
  11.     S s1(2); 
  12.     S s2(s1); 
  13.  
  14.  
  15.     return 0; 
當給s2初始化的時候調用了s2的拷貝構造函數,由於是值傳遞,系統會給形參st重新申請一段空間,然後調用自身的拷貝構造函數把s1的數據成員的值傳給st。當調用自身的拷貝構造函數的時候又因爲是值傳遞,所以。。。
也就是說,只要調用拷貝構造函數,就會重新申請一段空間,只要重新申請一段空間,就會調用拷貝構造函數,這樣一直下去就形成了一個死循環。
所以拷貝構造函數一定不能是值傳遞。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章