C++ 重載賦值運算符

——C++容許類對象賦值,這是經過自動爲類重載賦值運算符實現的,原型以下:函數

Class_name & Class_name_name::operator=(const Class_name &);

  

什麼時候使用:

將已有的對象賦給另外一個對象時,將使用重載的賦值運算符,初始化對象時,並不必定會使用賦值運算符this

StringBad metoo = knot;    // use copy constructor, possibly assignment, too

  使用複製構造函數,或實現時分兩步:使用複製構造函數建立一個臨時對象,而後經過賦值將臨時對象的值複製到新對象中指針

  • 與複製構造函數類似,賦值運算符的隱式實現也對成員進行逐個複製
  • 若是成員自己就是對象,則程序將使用爲這個類定義的賦值運算符來複制該成員
  • 靜態數據成員不受影響

隱式的問題:

與隱式複製構造函數相同:淺複製致使指針指向的內存數據受損(內存區被獲得值的對象修改或調用析構函數被釋放內存)對象

解決辦法:大致與複製構造函數相同,又有細微差異blog

  1. 用delete(delete[])釋放目標對象之前分配的數據
  2. 使用深度複製
  3. 返回指向調用對象的引用(實現連續賦值:a=b=c)
  4. 考慮賦給本身的狀況:應儘可能避免,或首先檢查自我複製,如果賦給本身,則直接返回調用對象
    StringBad &StringBad::operator=(const StringBad &st)
    {
        if (this == &st)    // 檢查自我複製    
            return *this;
        delete []str;
        len = st.len;
        str = new char [len + 1];
        std::strcpy(str, st.str);
        return *this;
    }
    

      代碼首先檢查自我複製內存

進一步重載:

爲提升效率,若是常常使用標準類型等可轉換爲類類型的賦值,則首先考慮重載一個徹底匹配的賦值運算符,以免建立和釋放臨時對象消耗多餘的執行時間和內存原型

相關文章
相關標籤/搜索