copy-swap idom :如果我更改 class 成员怎么办?

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

我有一个class

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

为了使用复制交换习惯用法,我创建了函数

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

如果稍后我更改 class 并删除成员 a,那么编译器会在 swap 函数中报错,这很好。

但是如果我添加一个新成员,我的swap函数就不再正确了。我该怎么做才能不忘记将新成员添加到交换功能?

问题是你的答案不是复制和交换成语。实际的复制和交换惯用语是为 class 编写复制构造函数和移动操作。后者将通过 std::swap 为您提供高效的交换操作。然后通过调用 class 复制构造函数创建本地副本来编写复制分配。然后将 *this 与临时文件交换。你不会一个一个地做。

不要忘记的最好方法就是不编写任何特殊成员函数,让编译器为您生成它们。这称为零规则。大多数 classes 应该不需要编写这些方法,而只需选择成员(或编写它们)以便生成的成员是正确的。添加成员时没有额外维护的原因之一。

最后,如果你在写资源管理class并且是手写这些函数,你不一定要使用copy和swap。复制和交换基本上以性能换取强大的异常安全性。我几乎从未使用过强大的异常安全性,而且在许多领域,以这种方式编写内容是不切实际的。所以只在你需要的时候使用它。