簡體   English   中英

對派生運算符使用派生類的復制和交換習慣用法

[英]Using the copy and swap idiom for assignment operator with derived classes

從不同的崗位,包括這一個我已經注意到了復制和交換成語但是我不知道如何當談到派生類實現此代碼。 那里的代碼指定為

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

    return *this;
}

我知道,只要在派生類中定義了自定義賦值運算符,則該方法就有責任調用基類的賦值運算符。 在這種情況下,我將如何最佳地調用基類的賦值運算符。 這是我的嘗試

dumb_array& operator=(dumb_array other)
{
    swap(*this, other); 
    baseclass::operator= other; //Suppose base class has assignment operator resembling this
    return *this;
}

我的理解是,如果我們從派生類中調用基類賦值運算符,那么復制構造函數(因為參數是值類型)將被調用兩次(一個派生,然后另一個代表基)(並且僅當是單個繼承鏈)調用派生類和基類的復制賦值運算符的最佳方法是什么? 我們是否需要對swap方法進行更改?

您正在混合在不同上下文中運行的兩個習慣用法。

swap調用可以交換POD或類似的東西。

另一方面,當您擁有類層次結構可能不正確時,這里是第二種方法(依靠基類知道如何交換自身可能更合適)。

但是還有另一點值得一提:重寫operator =是具有值語義的類的典型代表,而當您開始處理派生類(並且可能在僅持有指向基類的指針的對象上進行處理)時,情況就不再如此(並且您寧願clone()對象,而不是復制它們)

有沒有必要調用baseclass::operator=operator=在這種情況下派生類。 當按值傳遞參數時,您已經獲得了派生類的副本構造函數產生的有效副本,特別是應調用基類的副本構造函數。 因此,您的初始代碼對派生類也完全有效。

對派生運算符使用派生類的復制和交換習慣用法

這不是您應該做的事情(由於切片問題 )。 如果您的類具有多態行為,通常不需要分配-您將需要復制值,同時牢記多態行為。 這意味着在基類級別定義並在整個層次結構中實現的克隆。

暫無
暫無

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

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