簡體   English   中英

為什么使用交換來實現副本分配?

[英]Why using swap to implement copy assignment?

在這里: http : //en.m.wikipedia.org/wiki/Rule_of_three_(C++ _ programming)

/** Copy Assignment Operator */ 
Foo& operator= (const Foo& other) { 
  Foo temporary (other); 
  std::swap (data, temporary.data); 
  return *this;
 }

在示例中,它使用std::swap與臨時交換數據。 為什么我們要創建一個臨時和交換? 復印不是更快嗎? 我在其他地方也看到了這一點,並感到困惑。

交換技巧是確保異常安全的相當簡單的方法。

如果您進行逐字段復制,並且在中間出現異常,則對象可能最終處於不一致狀態(除非您采取措施解決此問題,否則可能會使事情復雜化)。

使用基於交換的實現,如果Foo temporary (other)拋出,則您的對象將保持其原始狀態不變。

另外,要啟用復制省略和(c ++ 11)移動語義:

Foo& operator= (Foo other) { 
  std::swap(data, other.data); 
  return *this;
}

這是為了避免出現不一致的狀態,或更確切地說是為了使例外安全性更好。

您還可以檢查此相關線程:- 什么是復制和交換慣用法?

正如GManNickG在上述線程中提到的那樣:-

它通過使用復制構造函數的功能來創建數據的本地副本,然后使用交換功能獲取復制的數據,將舊數據與新數據交換,從而工作。 然后,臨時副本將銷毀,並隨身攜帶舊數據。 我們剩下的是新數據的副本。

為了使用復制和交換的習慣用法,我們需要三件事:一個有效的復制構造函數,一個有效的析構函數(兩者都是任何包裝程序的基礎,因此無論如何都應完整)以及交換功能。

交換函數是一種非拋出函數,它交換一個類的兩個對象,一個成員一個成員。 我們可能很想使用std :: swap而不是提供我們自己的方法,但這是不可能的。 std :: swap在實現中使用了copy-constructor和copy-assignment運算符,我們最終將嘗試根據自身定義賦值運算符!

還要檢查為什么有些人將交換用於移動分配?

暫無
暫無

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

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