这种复制构造函数的实现是否有一些缺点?
Foo::Foo(const Foo& i_foo)
{
*this = i_foo;
}
我记得,在某本书中建议从赋值运算符调用复制构造函数并使用众所周知的交换技巧,但我不记得,为什么......
这种复制构造函数的实现是否有一些缺点?
Foo::Foo(const Foo& i_foo)
{
*this = i_foo;
}
我记得,在某本书中建议从赋值运算符调用复制构造函数并使用众所周知的交换技巧,但我不记得,为什么......
是的,这是个坏主意。所有用户定义类型的成员变量都会先被初始化,然后立即被覆盖。
那个交换技巧是这样的:
Foo& operator=(Foo rhs) // note the copying
{
rhs.swap(*this); //swap our internals with the copy of rhs
return *this;
} // rhs, now containing our old internals, will be deleted
operator=()
调用构造函数既有潜在的缺点,也有潜在的好处。
无论您是否指定值,您的构造函数都会初始化所有成员变量,然后operator=
再次初始化它们。这增加了执行的复杂性。您需要做出明智的决定,决定何时会在您的代码中产生不可接受的行为。
你的构造函数和operator=
变得紧密耦合。实例化对象时需要做的所有事情也将在复制对象时完成。同样,您必须聪明地确定这是否是一个问题。
您正在寻找Scott Meyers 的 Effective C++,第 12 项:“复制对象的所有部分”,其摘要指出:
- 复制函数应确保复制对象的所有数据成员及其所有基类部分。
- 不要试图实现其中一个复制功能。相反,将通用功能放在两者都调用的第三个函数中。