標準簽名
ClassName(const ClassName& other);
三大理由
- 防止修改源對象:拷貝構造語義是「基于 other 創建新對象」,不應改變 other。`const` 編譯期保證。
示例:other.ptr = nullptr; 在 `const` 版本中編譯報錯。
- 支持綁定臨時對象/右值:非 const 引用**不能**綁定臨時對象。
`ClassName obj = ClassName();` // 臨時對象只能綁定 `const&` 或 `&&`。
- 避免遞歸調用:若參數傳值 `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++ 價值語義基石。