2

我有一堂课

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

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

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

如果稍后我更改了我的类并删除了 member a,那么编译器会在swap函数中抱怨,这很好。

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

4

1 回答 1

5

问题是您的答案不是复制和交换习语。实际的复制和交换习惯用法是编写复制构造函数,并为类移动操作。后者将通过 std::swap 为您提供有效的交换操作。然后你通过调用你的类拷贝构造函数来创建你的拷贝赋值来创建一个本地拷贝。然后将 *this 与临时交换。你不是一个个成员一个成员地做。

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

最后,如果您正在编写资源管理类并且正在手动编写这些函数,则不一定要使用复制和交换。复制和交换基本上以性能换取强大的异常安全性。我几乎从未使用过强大的异常安全性,并且在许多领域中,以这种方式编写东西是不切实际的。所以只有在需要时才使用它。

于 2017-04-09T05:02:56.577 回答