簡體   English   中英

復制交換idom:如果我更改班級成員該怎么辦?

[英]copy-swap idom : what if I change the class members?

我有一堂課

class MyClass
{
public :
 int a;
 int b;
}

為了使用copy-swap習慣用法,我然后創建函數

void MyClass::swap(MyClass& other)
{
   std::swap(a,other.a);
   std::swap(b,other.b);
}

如果以后再更改類並刪除成員a ,則編譯器將在swap函數中抱怨,這很好。

但是,如果我添加一個新成員,我的swap功能將不再正確。 為了不忘記將新成員添加到交換功能,該怎么辦?

問題是您的答案不是復制和交換的習慣用法。 實際的復制和交換習慣是編寫復制構造函數,並移動該類的操作。 后者將通過std :: swap為您提供有效的交換操作。 然后,通過調用類副本構造函數創建本地副本來編寫副本分配。 然后將* this與臨時目錄交換。 您不是一個成員一個人地做。

最好的忘記方法是不編寫任何特殊的成員函數,而讓編譯器為您生成它們。 這稱為零規則。 大多數類不需要編寫這些方法,而只需選擇成員(或編寫它們)以使生成的成員正確即可。 原因之一是添加成員時無需額外維護。

最后,如果您正在編寫資源管理類並用手編寫這些函數,則不一定要使用復制和交換。 復制和交換基本上是為了增強異常安全性而交換性能。 我幾乎從來沒有使用過強大的異常安全性,並且在許多領域中,用這種方式編寫東西是不切實際的。 因此,僅在需要時使用它。

暫無
暫無

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

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