[英]Reset an object
最近,我經常通過使用operator=
為其分配新值來重置對象。 我的大多數課程都有一個copy constructor
和operator=
使用“ 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)相同。 它還使用了constructor
和destructor
的代碼,因此不需要編寫和維護額外的代碼。
所以我的問題是:是否有一種方法可以實現我的目標,即用干凈的代碼重置對象,而無需編寫額外的代碼,並且在構造新對象之前將對象銷毀?
如果構造函數中的代碼也需要由賦值運算符調用,則將該代碼放在私有成員函數中,並從析構函數和賦值運算符兩者中進行調用。
您的對象不會被銷毀(並且您不希望它真的被銷毀),但是它會和銷毀器做同樣的事情。
根據定義,如果將新值分配給舊對象,則在進行分配之前已經構造了新值。
您的“舊物件”也沒有被破壞。
所以沒有。沒有辦法。 而且不應該這樣:您不應該重新定義賦值運算符的“明顯”行為。
但是,除了波浪號和奇異的構造語法之外,新的放置方式可能對這里有所幫助,也許這段代碼接近“干凈” :)
Foo old(a, b, c);
old.~Foo(); // explicit destruction
new (&old) Foo(d, e, f);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.