簡體   English   中英

重置對象

[英]Reset an object

最近,我經常通過使用operator=為其分配新值來重置對象。 我的大多數課程都有一個copy constructoroperator=使用“ copy and swap”慣用語定義。 在大多數情況下,它雖然沒有達到應有的效率,但卻可以正常工作,但這在大多數情況下都沒有關系。 在一種情況下,這是行不通的。 需要在新對象的constructor之前調用destructor時間。

注意:我使用的大多數課程都是不可復制的

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)相同。 它還使用了constructordestructor的代碼,因此不需要編寫和維護額外的代碼。

所以我的問題是:是否有一種方法可以實現我的目標,即用干凈的代碼重置對象,而無需編寫額外的代碼,並且在構造新對象之前將對象銷毀?

如果構造函數中的代碼也需要由賦值運算符調用,則將該代碼放在私有成員函數中,並從析構函數和賦值運算符兩者中進行調用。

您的對象不會被銷毀(並且您不希望它真的被銷毀),但是它會和銷毀器做同樣的事情。

根據定義,如果新值分配給舊對象,則在進行分配之前已經構造了新值。

您的“舊物件”也沒有被破壞。

所以沒有。沒有辦法。 而且不應該這樣:您不應該重新定義賦值運算符的“明顯”行為。

但是,除了波浪號和奇異的構造語法之外,新的放置方式可能對這里有所幫助,也許這段代碼接近“干凈” :)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM