初始化列表:复制构造函数和赋值运算符=冗余?

Hoo*_*ked 2 c++ initialization copy-constructor assignment-operator

似乎initalizer列表对于类构造函数来说是一个好主意,而且我假设,对于复制构造函数也是如此.对于赋值运算符,必​​须在函数体中分配每个成员.考虑以下简单块:

class Foo {
private: 
  int a,b;
public:
  Foo(int c, int d)  : a(c), b(d) {}
  Foo(const Foo & X) : a(X.a), b(X.b) {}
  Foo& operator=(const Foo& X) {
    if (this == &X) return *this;
    a = X.a;
    b = X.b;
    return *this;
  }
};
Run Code Online (Sandbox Code Playgroud)

如果一个类具有适量的数据成员,则有三个地方可以搞乱不同的分配/初始化.我的意思是,如果复制构造函数看起来像:

  Foo(const Foo & X) : a(X.a), b(X.a) {}
Run Code Online (Sandbox Code Playgroud)

或者运营商缺少一条线=.由于赋值运算符和复制构造函数通常具有相同的效果(因为我们将成员从一个Foo复制到另一个Foo),我可以"重用"复制构造函数或赋值运算符中的代码,反之亦然吗?

Nic*_*las 10

您的目标应该是不要编写复制构造函数/赋值运算符.你的目标应该是让编译器去做.标准库容器都是可复制的,因此在合理的情况下使用它们.

如果有成员无法正确复制,则使用智能指针或其他RAII对象.那些对象是需要特殊拷贝构造函数/赋值的对象.他们只需要他们的一个成员.

其他一切都不应该使用它们.