首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 運算符= 中處理自我賦值的三種方法

     編輯:C++ 入門

問題場景

類持有動態分配資源(如 Bitmap* pb),operator= 若不檢查自我賦值會導致資源釋放後再讀取已釋放內存。

方法一:檢查指針相等

Widget& Widget::operator=(const Widget& rhs) {
    if (this == &rhs) return *this;
    delete pb;
    pb = new Bitmap(*rhs.pb);
    return *this;
}

方法二:先拷貝再釋放

Widget& Widget::operator=(const Widget& rhs) {
    Bitmap* pOrig = pb;
    pb = new Bitmap(*rhs.pb); // 可能拋出異常,但原資源未釋放
    delete pOrig;
    return *this;
}

方法三:Copy-and-Swap 惯用法(推薦)

Widget& Widget::operator=(Widget rhs) { // 參數傳值自動調用拷貝構造
    swap(rhs); // 交換內部資源
    return *this; // rhs 析構釋放舊資源
}

優點:異常安全、碼簡潔、天然處理自我賦值。需提供 swap 成員函數( noexcept)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved