首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

為什麼複製建構子不能用傳值呼叫?深度解析無限遞迴機制

     編輯:關於C語言

編譯器直接報錯

嘗試將複製建構子參數寫成傳值(S(const S st))時,編譯器會報錯:error: invalid constructor; you probably meant 'S (const S&)'。這不是隨意限制,而是語言機制使然。

無限遞迴的推導過程

class S {
    int a;
public:
    S(int x) : a(x) {}
    S(const S st) { a = st.a; } // 傳值參數
};

int main() {
    S s1(2);
    S s2(s1); // 初始化 s2
}

逐步展開

  1. S s2(s1) 呼叫複製建構子,參數 st 需初始化
  2. 因為是傳值,編譯器必須為 st 建立一個新物件
  3. 建立 st 又需要呼叫複製建構子(以 s1 為引數)
  4. 進入複製建構子,又要為參數建立新物件……
  5. 無限遞迴,直到堆疊溢位或編譯器直接禁止

傳參考避開問題

S(const S& st) 只傳遞位址,不建立新物件,自然斷開遞迴鏈。這也是 C++ 標準強制要求的理由。

延伸:移動語意下的演進

C++11 引入移動建構子 S(S&&),同樣採用參考(右值參考),同樣避免物件複製。核心邏輯一致:複製建構子的參數必須是參考型別。

作者:c小加

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved