首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 拷貝構造函數參數為什麼是 const 引用:防止修改源對象、支持臨時對象、避免遞歸

     編輯:程式設計疑難解答

標準簽名

ClassName(const ClassName& other);

三大理由

  1. 防止修改源對象:拷貝構造語義是「基于 other 創建新對象」,不應改變 other。`const` 編譯期保證。
    示例:other.ptr = nullptr; 在 `const` 版本中編譯報錯。
  2. 支持綁定臨時對象/右值:非 const 引用**不能**綁定臨時對象。
    `ClassName obj = ClassName();` // 臨時對象只能綁定 `const&` 或 `&&`。
  3. 避免遞歸調用:若參數傳值 `ClassName(ClassName other)`,調用構造函數需先拷貝實參 → 無限遞歸。

const 保護深度

`const ClassName&` 保護 **頂層 const**:不能修改 `other` 的非靜態成員變量(如 `other.ptr = nullptr`),但**不能保護指針指向的內容**(`*(other.ptr) = 10` 合法)。深層不可變需自行設計。

現代 C++ (C++11) 补充

  • 移動構造:`ClassName(ClassName&& other) noexcept` 接管資源,源對象置空。
  • 刪除拷貝:`ClassName(const ClassName&) = delete;` 禁止拷貝(如獨占資源類)。
  • Rule of Five:析構、拷構、拷賦、移構、移賦 五者統籌。

總結

`const&` 是拷貝構造的標準參數形式,兼顧**語義正確**、**右值兼容**、**避免遞歸**,是 C++ 價值語義基石。

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