標籤:

在編程中,賦值是先把左側對象銷毀,然後再把右側對象賦給左側對象,那麼a=a即自己給自己賦值怎麼完成呢?

a=a,a已經先被銷毀了,為什麼還能完成賦值


對於有 non-trivial destructor 的類來說,self-assignment 是要注要的。

如果寫成這樣的 copy assignment,是不用理會 self-assignment 的,但會有額外的 copy/move constructor 調用消耗:

T T::operator=(T arg) // copy/move constructor is called to construct arg
{
swap(arg); // resources are exchanged between *this and arg
return *this;
} // destructor of arg is called to release the resources formerly held by *this

如果原來的資源還可再利用,就可以寫成這種形式:

T operator=(const T other) // copy assignment
{
if (this != other) { // self-assignment check expected
if (/* storage cannot be reused (e.g. different sizes) */)
{
delete[] mArray; // destroy storage in this
/* reset size to zero and mArray to null, in case allocation throws */
mArray = new int[/*size*/]; // create storage in this
}
/* copy data from others storage to this storage */
}
return *this;
}

對於傳進 const T 的 assignment operator,需要檢測 self-assignment。

例子來自 operator overloading


以前有人教過我,類里有自己管理的資源,就得自己寫賦值、拷貝構造、移動構造函數。因此這種情況下,是不是先銷毀左側的值是可以你自己決定的。

也就是說,你不銷毀,任憑內存泄漏也是可以的。

而實際代碼中一般都會判斷a!=a再做處理。

科學的解釋請看M大的答案


把右邊a的內容考到寄存器 由CPU運算後{這裡並不需要運算}再從寄存器拷貝到a(左邊的)所在的地址

看看計算機組成原理就會明白

如有錯誤多謝指正


如果是c++的話,重載=操作符,然後怎麼銷毀就由你的重載函數決定了,對於系統內建基本類型,如int類型的數據,那就由編譯器決定


operator= 用copy and swap 的方式實現

或者先判斷如果是自賦值直接return *this也行


首先這種情況是可能發生的,比如T *a, *b;/*...*/b=a;*b=*a;

其次拷貝賦值就是拷貝一下,至於為什麼可以拷貝,因為彙編就是可以把一塊內存mov到原地啊,這有什麼問題嗎?


屠龍寶刀只有一把,誰搶到就算誰的。難道你要把謝遜手裡的屠龍刀毀了,自己再重造一把?


推薦閱讀:

關於計算機專業學習c語言的?
在modern c++中,模板元編程有哪些更方便的寫法?
遊戲中注入dll是什麼意思,具體怎麼實現的?
C語言怎麼理解書上寫&取址操作符不能用於常量、表達式和register類型變數?
PS教程:創建一個James White風格懷舊海報

TAG:CC |