c++ - 重置对象

标签 c++ constructor destructor copy-and-swap

最近,我经常使用 operator= 为它分配一个新值来重置一个对象。我的大多数类都有一个 copy constructoroperator= 使用“copy and swap”习惯用法定义。在大多数情况下,它工作得很好,尽管效率不高,但这在大多数情况下并不重要。有一种情况是这不起作用。它是在 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 引用)。然而this answer on stackOverflow让我不这么认为。

我真的很喜欢 operator= 来重置我的对象,因为代码很干净并且与内置类型(如 int)相同。它还使用了 constructordestructor 中的代码,因此无需编写和维护额外的代码。

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

最佳答案

根据定义,如果您一个新值赋给一个旧对象,则新值在赋值发生之前就已经构造好了。

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

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

但是除了波浪号和奇异的构造语法之外,placement new 在这里可能有所帮助,也许这段代码接近“干净”:)

Foo old(a, b, c);
old.~Foo(); // explicit destruction
new (&old) Foo(d, e, f);

关于c++ - 重置对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35504133/

相关文章:

c++ - 抛出未处理的自定义异常后如何调用 what()?

C++重载运算符<<输出地址

c++ - Websocket hybi-17新数据格式C++

C++ 麻烦的析构函数

c++ - 执行覆盖的继承函数

c++ - 当类A在构造时分配内存时,在类B的构造函数中动态创建vector <class A>

c++ - 带有赋值重载语法的复制构造函数?

C++11 空标志类

c++ - 继承中调用构造函数的顺序

.net - 当 native (C++) 异常传播到 CLR 组件时未调用析构函数