C++ 重置对象

C++ 重置对象,c++,constructor,destructor,copy-and-swap,C++,Constructor,Destructor,Copy And Swap,最近,我经常通过使用操作符=为对象指定新值来重置对象。我的大多数类都有一个copy构造函数和operator=,使用“复制和交换”习惯用法定义。这在大多数情况下都很好,尽管效率不如预期的那么高,但大多数情况下这并不重要。但有一种情况是,这不起作用。当需要在新对象的构造函数之前调用析构函数时 注意:我使用它的大多数类都是不可压缩的 class Foo { public: Foo() : m_i(0) {} Foo(int i) : m_i(i) {} Foo(Foo&am

最近,我经常通过使用
操作符=
为对象指定新值来重置对象。我的大多数类都有一个
copy构造函数
operator=
,使用“复制和交换”习惯用法定义。这在大多数情况下都很好,尽管效率不如预期的那么高,但大多数情况下这并不重要。但有一种情况是,这不起作用。当需要在新对象的
构造函数
之前调用
析构函数

注意:我使用它的大多数类都是不可压缩的

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
}
然后我教过重写
操作符=
,首先手动调用
析构函数
,然后执行
交换
(在这种情况下,
rhs
将由const引用)。然而,这让我产生了另一种想法

我非常喜欢operator=重置我的对象,因为代码是干净的,并且与内置类型(如int)相同。它还使用来自
构造函数
析构函数
的代码,因此不需要编写和维护额外的代码


所以我的问题是:有没有一种方法可以实现我的目标,用干净的代码重置我的对象,而不需要编写额外的代码,并且在构建新的对象之前销毁该对象?

如果构造函数中的代码也需要赋值操作符调用,然后将该代码放入私有成员函数中,并从析构函数和赋值运算符调用该函数

您的对象不会被析构函数破坏(您也不希望它真的被破坏),但它将执行与析构函数相同的操作。

根据定义,如果您为旧对象分配了一个新值,则新值是在分配发生之前构造的

您的“旧对象”也没有真正被破坏

所以不,没有办法。不应该:不应该重新定义赋值运算符的“明显”行为

但是,除了tilde和异国情调的构造语法之外,placement new可能在这里有所帮助,也许这段代码接近“clean”:


从示例中可以看到,构造函数的主体中没有代码。然而变量
mi
被初始化。我想可以在构造函数的主体中设置变量,但这并不总是可能的或可取的。重置对象的一般方法是什么?我可以使用新语法编写reset()方法。谢谢你的主意。
Foo old(a, b, c);
old.~Foo(); // explicit destruction
new (&old) Foo(d, e, f);