——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; }代碼首先檢查自我復制
進一步多載:
為提高效率,如果經常使用標準型別等可轉換為型別別的賦值,則首先考慮多載一個完全匹配的賦值運算子,以避免創建和釋放臨時物件消耗多余的執行時間和記憶體
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/13772.html
標籤:C++
上一篇:C++ 復制建構式
下一篇:C++ 空指標
