簡體   English   中英

關於分配操作員過載

[英]Regarding Assignment Operator Overload

我試圖重載賦值運算符,並嘗試使用“復制和交換”習慣用法來避免內存泄漏。 我已經實現了自己的默認構造函數和復制構造函數。 我只需要知道在我的主語中何時說a=b並調用賦值運算符,那么在(第2行)的參數部分會發生什么。 我只想知道在參數部分發生的動作。

template <class T>
Mystack<T> & Mystack<T>::operator=(Mystack<T> source) // Line 2, 
//Passing by value intentionally  

選項1 :調用默認構造函數,並且在source代碼中執行默認構造函數中提及的任何代碼。

選項2 :調用默認構造函數並發生按值復制,並且b的值復制到source

選項3 :調用Copy構造函數,並按值進行復制,並且source獲得與b相同的值。

如果以上都不是,請告訴我參數部分實際發生了什么。

template <class T>
Mystack<T> & Mystack<T>::operator=(Mystack<T> source)

該賦值運算符通過value獲得其自變量,這意味着調用方將傳遞一個新的Mystack<T> ,但該構造將被構造。

當您實現自己的復制構造器而沒有移動構造器時,如果不就地構造,肯定會調用該構造器。

調用不會在source上調用任何東西,直到您返回並且在完整表達式的末尾調用析構函數銷毀參數為止。

一些例子:

using A = MyStack<T>;
A make_a();
A a, b;
a = b; // Calls the copy-ctor to construct the argument to op=
a = A(); // Directly constructed as the argument
a = make_a(); // Return-value is directly used as the argument

傳遞值允許創建新對象。 創建此對象的方式取決於其初始化表達式的類型。 如果參數是左值,則調用復制構造函數,同樣,如果它是右值,則調用移動構造函數。

如果您自己沒有提供它們,也沒有聲明任何會阻止其創建的特殊成員函數(在其他條件中),則編譯器將為您提供這兩個函數。

MyStack<int> a, b;
a = b;            // Calls MyStack(MyStack const&)
a = std::move(b); // Calls MyStack(MyStack&&)

以價值為依據的目的是擁有一個全新的對象。 這可以通過兩種方式完成-通過將舊對象復制到新對象,或將所有權與不再需要的對象交換。

a = b行上, b的內容被復制到參數source a = std::move(b)交流所有權b通過去除其“膽”,並將其給予a a現在擁有b曾經擁有的任何東西,並且b的內部結構處於類似於從對象移出的狀態。

請注意,通過值初始化參數是copy-initialization ,盡管其名稱為move-constructor,但仍可以使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM