——C++允許類對象賦值,這是通過自動為類重載賦值運算符實現的,原型如下: Class_name & Class_name_name::operator=(const Class_name &); 何時使用: 將已有的對象賦給另一個對象時,將使用重載的賦值運算符,初始化對象時,並不一定會使用賦值運算 ...
——C++允許類對象賦值,這是通過自動為類重載賦值運算符實現的,原型如下:
Class_name & Class_name_name::operator=(const Class_name &);
何時使用:
將已有的對象賦給另一個對象時,將使用重載的賦值運算符,初始化對象時,並不一定會使用賦值運算符
StringBad metoo = knot; // use copy constructor, possibly assignment, too
使用複製構造函數,或實現時分兩步:使用複製構造函數創建一個臨時對象,然後通過賦值將臨時對象的值複製到新對象中
- 與複製構造函數相似,賦值運算符的隱式實現也對成員進行逐個複製
- 如果成員本身就是對象,則程式將使用為這個類定義的賦值運算符來複制該成員
- 靜態數據成員不受影響
隱式的問題:
與隱式複製構造函數相同:淺複製導致指針指向的記憶體數據受損(記憶體區被得到值的對象修改或調用析構函數被釋放記憶體)
解決辦法:大體與複製構造函數相同,又有細微差別
- 用delete(delete[])釋放目標對象以前分配的數據
- 使用深度複製
- 返回指向調用對象的引用(實現連續賦值:a=b=c)
- 考慮賦給自己的情況:應儘量避免,或首先檢查自我複製,若是賦給自己,則直接返回調用對象
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; }
代碼首先檢查自我複製
進一步重載:
為提高效率,如果經常使用標準類型等可轉換為類類型的賦值,則首先考慮重載一個完全匹配的賦值運算符,以避免創建和釋放臨時對象消耗多餘的執行時間和記憶體