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对象.那些对象是需要特殊拷贝构造函数/赋值的对象.他们只需要他们的一个成员.
其他一切都不应该使用它们.