【发布时间】:2011-12-24 20:18:18
【问题描述】:
对于您的类构造函数,初始化列表似乎是good idea,我假设对于复制构造函数也是如此。对于赋值运算符,必须为函数主体中的每个成员赋值。考虑以下简单块:
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;
}
};
如果一个类的数据成员数量适中,则在三个地方可能会弄乱不同的分配/初始化。我的意思是,如果复制构造函数看起来像:
Foo(const Foo & X) : a(X.a), b(X.a) {}
或者operator=中缺少一行。由于赋值运算符和复制构造函数通常具有相同的效果(因为我们将成员从一个 Foo 复制到另一个)我可以“重用”来自复制构造函数或赋值运算符的代码,反之亦然?
【问题讨论】:
-
获得正确的复制构造函数和赋值运算符比看起来要困难得多;你真的应该阅读FAQ on the copy-and-swap idiom。另一方面,正如其他人所说,在这种情况下,不需要用户声明的复制构造函数和赋值运算符。
-
我通常在构造函数中使用operator=:Foo(const Foo & X){ *this = X;}
-
@freerider:一般来说,如果你的班级管理
operator=在复制之前需要释放的资源,这不是一个好主意。 -
@matteo italia:我知道,但我刚刚回答了这个示例中不包含堆分配的问题。当然你不应该在更复杂的类中使用。
标签: c++ copy-constructor assignment-operator initialization