C++進階--處理拷貝賦值運算符中自賦值的情況
阿新 • • 發佈:2018-12-23
賦值運算符 減少 code 重載 clas 一個 his 異常 pre
//############################################################################ /* * 處理拷貝賦值運算符=中自賦值的情況 * * * 運算符重載: 利用人們的直覺,減少學習曲線 */ // 自賦值的情況 dog dd; dd = dd; // 看起來很傻 dogs[i] = dogs[j]; // 看起來不怎麽傻 /* 實現賦值運算符 */ class collar; class dog { collar* pCollar; dog& operator=(const dog& rhs) { if (this == &rhs) return *this; collar* pOrigCollar = pCollar; pCollar = new collar(*rhs.pCollar); //可能會失敗,保證異常安全 delete pOrigCollar; return *this; } } /* 實現 2: 委托 */ class dog { collar* pCollar; dog& operator=(const dog& rhs) { *pCollar = *rhs.pCollar; // 逐成員拷貝collar,或者調用collar的拷貝賦值運算符= return *this; } } /* 實現 3:copy and swap -- C++中析構函數和swap時強異常安全的 拷貝構造生成一個臨時對象,然後跟本對象swap 異常安全,且天然解決了自賦值問題 註意swap的可見性問題 */ class dog { collar* pCollar; dog& operator=(const dog& rhs) { dog tmp_dog(rhs); this->swap(&tmp_dog); return *this; } } dog::swap(dog* rhs) { this->pCollar->swap(rhs->pCollar); //swap(this->pCollar, rhs->pCollar); }
C++進階--處理拷貝賦值運算符中自賦值的情況