c++ - 复制交换 idom : what if I change the class members?

标签 c++ copy-and-swap

我有课

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

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

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

如果稍后我更改类并删除成员 a,那么编译器将在 swap 函数中发出错误消息,这没问题。

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

最佳答案

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

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

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

关于c++ - 复制交换 idom : what if I change the class members?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43303070/

相关文章:

c++ - TrackMouseEvent 不工作

c++ - C++中不区分大小写的字符串比较

c++ - constexpr 重载

c++ - 在 copy-and-swap 习语中实现交换

c++ - 如何正确地为抽象类制作深拷贝?

c++ - 什么时候 copy-and-swap 习语不适用

c++ - 重用 copy-and-swap 习惯用法

c++ - 有一个 throwing swap 成员实现可以吗?

c# - ZMQ recv 随机拾取垃圾数据 有谁知道为什么?

c++ - 禁用 typedef 之间的隐式转换