複製賦值運算子中透過引用回傳:一個複雜的概念揭曉
C 中從複製賦值運算子令人困惑。為什麼不簡單地傳回新物件的副本?為了解開這個謎團,讓我們深入研究一個涉及 A 類及其賦值運算子的範例:
class A { public: A(int param); A& operator=(const A& a); private: int param; }; int main() { A a1(10); A a2 = a1; A a3; a3 = a2; // The problematic line } A::A(int param) : param(param) {} A& A::operator=(const A& a) { if (this == &a) { return *this; } param = a.param; return *this; }
最初,從賦值運算子傳回一個值似乎是一個可行的選擇。然而,在這種情況下按值返回會帶來一些缺點。每次呼叫賦值運算子時,都會呼叫建構函式和析構函式。考慮以下賦值鏈:
a = b = c;
傳回值時,此鏈會觸發對賦值運算子的兩次呼叫、對複製建構函式的兩次呼叫、以及對析構函式的兩次呼叫。這種浪費的過程消耗了不必要的資源,並且沒有提供任何實際的好處。
相較之下,透過引用回傳可以顯著減少開銷。值從一個物件複製到另一個對象,無需額外的建構函式或析構函式呼叫。這種最佳化在發生多次賦值的複雜場景中尤其重要。
總而言之,在複製賦值運算子中按值返回沒有任何優勢,但會帶來嚴重的效能損失。相較之下,透過引用返回可確保高效率的資源利用,同時保持運算符的功能。
以上是為什麼從 C 複製賦值運算子返回引用而不是值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!