最近我经常通过用operator=
. 我的大多数课程都有一个copy constructor
并operator=
使用“复制和交换”习语定义。在大多数情况下都可以正常工作,尽管效率不高,但这并不重要。但是有一种情况是行不通的。它什么时候destructor
需要constructor
在新对象之前调用。
注意:我使用它的大多数类都是不可复制的
class Foo
{
public:
Foo() : m_i(0) {}
Foo(int i) : m_i(i) {}
Foo(Foo&& rhs);
Foo& operator=(Foo rhs);
friend void swap(Foo& lhs, Foo& rhs);
private:
Foo(Foo& rhs) {} // uncopyable object
int m_i;
};
Foo::Foo(Foo&& rhs)
: Foo()
{
swap(*this, rhs);
}
Foo& Foo::operator=(Foo rhs)
{
swap(*this, rhs);
return *this;
}
void swap(Foo& lhs, Foo& rhs)
{
using std::swap;
swap(lhs.m_i, rhs.m_i);
}
int main()
{
Foo f(123);
f = Foo(321); // at one time both Foo(123) and Foo(321) exist in memory
}
然后我教过可能重写operator=
以首先手动调用destructor
然后执行swap
(在这种情况下rhs
将由 const 引用)。然而,stackOverflow 上的这个答案让我不这么认为。
我真的很喜欢 operator= 来重置我的对象,因为代码很干净并且与内置类型(如 int)相同。它还使用 和 的代码constructor
,destructor
因此不需要编写和维护额外的代码。
所以我的问题是:有没有办法实现我的目标,用干净的代码重置我的对象,无需编写额外的代码,并在构造新对象之前销毁对象?