簡體   English   中英

復制構造函數和賦值都需要嗎?

[英]Is there a need for both the copy constructor and assignment?

我在stackOverflow上閱讀了兩篇文章,一篇描述了復制和交換的習慣用法,另一篇關於移動語義,但是我看不到為什么在移動構造函數或復制構造函數已經為我們完成了這件事之后,為什么需要在賦值運算符中進行交換

因此,據我所解釋,如果我們使用左值,賦值運算符將使用副本構造函數構造一個對象,如果右值將使用移動構造函數構造一個對象,那么可以說我們選擇后者

可以說我們有一個交換對象成員的函數,下面是賦值運算符,所以正如我所說,我們首先要有一個右值,operator =將使用move構造函數構造一個對象,所以為什么在這里需要swap函數?

我們已經實現了我們想要的目標,我們使用move構造函數創建了一個對象,並“竊取或獲取了”我們需要的數據,那么額外交換的需求是什么?

我們不是只是在交換相同的內容而已嗎?

這是文章/主題

什么是移動語義?

什么是復制和交換習語?

dumb_array& operator=(dumb_array other) // (1)
{
    swap(*this, other); // (2)

    return *this;
}

分配對象時有兩個注意事項:

  1. 我們希望將源內容的副本復制到目標中。
  2. 我們希望正確處理目標的原始內容。

由於我們有一個復制構造函數,因此第一步已為我們完成。 我們可以move臨時副本的內容move目標位置,但是第二點要注意什么呢?

我們有一個處理程序的析構函數,那么為什么不使用它呢? 如果將目標的內容替換為臨時的內容,則銷毀臨時文件可確保正確釋放目標的原件,而無需編寫新代碼或復制現有代碼。

請注意,“復制和交換”可能比您真正需要的要重,但是它永遠不會失敗(假設它所依賴的功能是正確的),這使它成為一個很好的起點。

暫無
暫無

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

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