——C++容許類對象賦值,這是經過自動爲類重載賦值運算符實現的,原型以下:函數
Class_name & Class_name_name::operator=(const Class_name &);
將已有的對象賦給另外一個對象時,將使用重載的賦值運算符,初始化對象時,並不必定會使用賦值運算符this
StringBad metoo = knot; // use copy constructor, possibly assignment, too
使用複製構造函數,或實現時分兩步:使用複製構造函數建立一個臨時對象,而後經過賦值將臨時對象的值複製到新對象中指針
與隱式複製構造函數相同:淺複製致使指針指向的內存數據受損(內存區被獲得值的對象修改或調用析構函數被釋放內存)對象
解決辦法:大致與複製構造函數相同,又有細微差異blog
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; }
代碼首先檢查自我複製內存
爲提升效率,若是常常使用標準類型等可轉換爲類類型的賦值,則首先考慮重載一個徹底匹配的賦值運算符,以免建立和釋放臨時對象消耗多餘的執行時間和內存原型