重載賦值運算符(operator =)及swap

1. operator= 返回一個reference to *this, 即重載賦值運算符時要返回*this對象的引用

2. 在operator =中處理“自我賦值”, 即重載賦值運算符時要儘量考慮當傳遞的參數是自身對象時的情況, eg:

if(this = &meb)
   return *this

3. swap操作

(1) 容器類的swap函數: vector.swap(meb)

不會刪除原始數據也不會申請新的空間, 且迭代器也不會失效(我的理解是隻是交換讀取數據的指針位置),所以速度會很快

(2) 泛型算法的swap函數: std:swap(meb1,meb2)

例:
String& operator=(String rhs) // yes, pass-by-value
{
     swap(rhs);
     return *this;
}
void swap(String& rhs)
{
    std::swap(data_, rhs.data_);
}
(a) String &, 返回*this對象的引用
(b) String rhs, 使用值傳遞而不使用引用的方式傳遞參數的是由於之後會使用swap函數, 那麼this->data_會竊取rhs.data_的資源,反之rhs.data_也是, 但由於this->data_並沒有申請空間, 所以此時rhs.data_指向了空, 破壞了傳進來的數據. 而使用值傳遞方式, 會創建一個臨時對象, 而this->data_是竊取的臨時對象的資源, 而臨時對象本來重載函數調用之後就會回收,所以也沒有其他影響.
(3) 如果rhs是this對象本身,也不要緊, 因爲傳進來跟不是this對象, 而是拷貝this對象的臨時對象.



Reference

[1] 《Effective C++》學習筆記條款10 令operator= 返回一個reference to *this
[2]  C++面試中string類的一種正確寫法



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章