複製賦值運算子中引用/常數引用回傳的必要性
C 中的複製賦值運算子引發了有關其回傳類型運算子引發了有關其回傳類型的問題。為什麼它回傳一個引用或一個常數引用而不是新物件的副本?為了闡明這個概念,請考慮以下場景:
A a1(param); A a2 = a1; A a3; a3 = a2; // The problematic line
假設複製賦值運算子定義如下:
A A::operator=(const A& a) { if (this == &a) { return *this; } param = a.param; return *this; }
從複製賦值運算子傳回引用具有顯著的優點關於歸還副本。透過傳回引用,它可以完成最少的工作,因為它僅將值從一個物件複製到另一個物件。
但是,按值回傳會產生額外的開銷。每次呼叫賦值運算子時,都會呼叫建構函數和析構函數,導致不必要的資源消耗。例如:
A& operator=(const A& rhs) { /* ... */ }; a = b = c; // Calls assignment operator twice. Efficient.
相反:
A operator=(const A& rhs) { /* ... */ }; a = b = c; // Calls assignment operator twice, calls copy constructor twice, calls destructor twice for temporary values. Inefficient.
因此,從複製賦值運算子返回引用或const 引用可以透過避免不必要的物件建立和銷毀來優化效能,從而提高效率和程式碼可維護性。
以上是為什麼 C 複製賦值運算子返回引用而不是副本?的詳細內容。更多資訊請關注PHP中文網其他相關文章!