我有课
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/