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

C++ 類組合與拷貝建構式:參數傳值導致多次拷貝

     編輯:程式設計綜合問答

程式碼中 Line(Point xp1, Point xp2) 參數以傳值方式接收 Point 物件,導致建構 Line 時觸發 4 次 Point 拷貝建構式;拷貝建構 Line 時再觸發 2 次。

拷貝次數分析

  1. Line line(myp1, myp2); 呼叫建構式:
    • 實參 myp1 傳值給形參 xp1 → 第 1 次拷貝。
    • 實參 myp2 傳值給形參 xp2 → 第 2 次拷貝。
    • 初始化列表 : p1(xp1), p2(xp2) 以形參初始化成員 → 第 3、4 次拷貝。
  2. Line line2(line); 呼叫拷貝建構式:
    • : p1(L.p1), p2(L.p2) 以來源物件成員初始化新成員 → 第 5、6 次拷貝。

解決方案:改用 const 參考

// 建構式
Line(const Point& xp1, const Point& xp2) : p1(xp1), p2(xp2) { ... }

// 拷貝建構式
Line(const Line& L) : p1(L.p1), p2(L.p2) { len = L.len; }
  • 傳參考避免形參拷貝(省 2 次)。
  • const 允許綁定暫時物件與常量。
  • 初始化列表直接以參考初始化成員(仍需 2 次拷貝,但無法再省)。

進階:C++11 移動語意

若 Point 管理資源(動態記憶體等),可提供移動建構式 Point(Point&&) 並配合 std::move 實現零拷貝轉移。

核心原則:非基本型別參數優先用 const 參考,需修改時用非 const 參考,極少數情況(如需副本)才傳值。

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