程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於拷貝(復制)構造函數為什麼不能用值傳遞

關於拷貝(復制)構造函數為什麼不能用值傳遞

編輯:關於C語言

當你嘗試著把拷貝構造函數寫成值傳遞的時候,會發現編譯都通不過,錯誤信息如下:
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小加

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved