條款 11:在 operator= 中處理“自我賦值”
《Effective C++ 中文版 第三版》讀書筆記
** 條款 11:在 operator= 中處理“自我賦值” **
w = w;//賦值給自己
a[i] = a[j];//潛在的自我賦值
*px = *py;//潛在的自我賦值
方案一:
Toby& Toby::operator=(const Toby& t)
{
if(this == &t) return *this; //< 證同測試,如果是自我賦值,就不做任何事,該測試較耗時
delete pt;
pt = new pToby(*t.pt);
return *this;
}
方案二:
Toby& Toby::operator=(const Toby& t)
{
pToby* pOld = pt; //< 記住原來的 pt
pt = new pToby(*t.pt); //< 令 pt 指向 *pt 的一個副本
delete pOld; //< 刪除原先的pt
return *this;
}
方案三:
class Toby{
...
void swap(Toby& t); //< 交換 *this 和 t 的資料
...
};
Toby& Toby::operator=(const Toby& t)
{
Toby tmp(t); //< 為 t 資料製作一份副本
swap(tmp); //< 將 *this 資料和上述復件的資料交換
return *this;
}
方案四:
Toby& Toby::operator=(Toby t) //< t 是被傳物件的一份副本,注意這裡是 pass by value,將 *this 的資料和副本放入資料交換
{
swap(t);
return *this;
}
請記住:
- 確保當物件自我賦值時 operator= 有良好的行為。其中技術包括比較“來源物件”和“目標物件”的地址、精心周到的語句順序、以及 copy-and-swap。
- 確定任何函式如果操作一個以上的物件,而其中多個物件是同一個物件時,其行為仍然正確。
相關文章
- Effective c++條款11:在operator=中處理“自我賦值”C++賦值
- C++筆記 11:在operator中處理“自我賦值“C++筆記賦值
- (11)mysql 中的條件定義、處理MySql
- Oracle 在連線條件裡處理和比較 NULL 值OracleNull
- 李光榮在無懼中挑戰自我,實現自我價值
- 影像處理或其他多媒體處理中的值溢位處理
- 在oracle中處理日期Oracle
- 如何處理JavaScript 中的貨幣值?JavaScript
- Java 11:在Java中處理HTTP和WebSocket的新方法!JavaHTTPWeb
- 在處理鏈中呼叫APD
- 遊戲運營的自我修養(中):學會條理、主動出擊遊戲
- Makefile中幾種賦值(= := ?= +=)賦值
- selenium中JS如何處理滾動條JS
- 為什麼在pyhton中不能用函式重新賦值函式賦值
- Recoil 中預設值的正確處理
- openCV中的影像處理 3 影像閾值OpenCV
- 關於JF框架中的空值處理框架
- Windows批處理中的變數和值Windows變數
- 遊戲基礎知識——遊戲的“自我賦權”和“非自我賦權”傾向遊戲
- 小米海外發布四款Redmi Note 11 涵蓋四款處理器
- 在Python中處理分數Python
- 在REST SOE中處理JSONRESTJSON
- 04 Windows批處理中的條件執行Windows
- Operator-sdk 在 KaiwuDB 容器雲中的使用AI
- DOM在Ahooks中的處理過程Hook
- 在MDX中處理邊界情況
- 【c++】深賦值與淺賦值C++賦值
- web中,利用反射給物件賦值Web反射物件賦值
- webapp 中為span元素賦值WebAPP賦值
- More Effective C++ 條款11 (轉)C++
- php之普通變數賦值、物件賦值、引用賦值的區別PHP變數賦值物件
- SQL 處理重複值SQL
- JBPM4.3 流程處理中設定流程中變數值變數
- Javascript 解構賦值,將屬性/值從物件/陣列中取出,賦值給其他變數JavaScript賦值物件陣列變數
- 在 C 程式中處理 UTF-8 文字
- 怎樣在 Laravel 中處理前端認證Laravel前端
- 在 Laravel 中優雅處理 Form 表單LaravelORM
- Javascript學習筆記——4.11 賦值表示式JavaScript筆記賦值