繁体   English   中英

复制交换idom:如果我更改班级成员该怎么办?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM