[英]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.