在c++中也提供了賦值運算子「=」的過載,其原理和深淺拷貝相同,都需要解決淺拷貝所帶來的堆區記憶體重複釋放的問題,那麼我們來看看,怎麼同賦值運算子過載來解決問題
#include
#include
using
namespace std;
//賦值運算子過載
class
person
~person()
}//使用賦值運算子過載來避免淺拷貝導致的堆區記憶體重複釋放
person&
operator
=(person& p)
//接收乙個新物件的資料
//然後重新在堆區建立新的資料來進行深拷貝操作
m_age =
newint
(*p.m_age)
;//建立乙個與傳入物件的屬性值同等大小的記憶體空間,所以需要解引用
return
*this
;//返回物件本身
//方便進行鏈式程式設計
}int
* m_age;
//在堆區建立資料
};
其中,這一部分就是賦值運算子過載的核心內容
//使用賦值運算子過載來避免淺拷貝導致的堆區記憶體重複釋放
person&
operator
=(person& p)
//接收乙個新物件的資料
//然後重新在堆區建立新的資料來進行深拷貝操作
m_age =
newint
(*p.m_age)
;//建立乙個與傳入物件的屬性值同等大小的記憶體空間,所以需要解引用
return
*this
;//返回物件本身
//方便進行鏈式程式設計
}
形參中和深淺拷貝相同,都需要傳入另乙個物件來完成賦值操作,當然,若寫成全域性函式,則需要傳入兩個物件。
由於在類內建構函式中,使用了有參建構函式來對成員屬性初始化,並且是在堆區開闢空間來儲存資料,所以在運算子過載函式過程中,需要先判斷物件本身是否有在堆區開闢空間,若有,則需要先清空其所在堆區開闢的空間,否則會導致部分記憶體空間無用化,浪費空間。
然後就與深拷貝操作相當,需要重新開闢乙個與賦值物件成員屬性相等的記憶體空間,所以使用到了*p.m_age;利用解引用的方式得到另乙個物件成員屬性的具體數值來開闢相等的記憶體空間。
開闢多乙個新的記憶體空間來儲存所被賦值的值,可以保證在進行析構函式的執行過程中不會導致同一快記憶體空間的重複釋放,導致記憶體崩潰,也就是所謂的淺拷貝問題
最後返回物件本身,方便鏈式程式設計。
剩餘**
void
test01()
intmain()
其中
p2=p1=p;的運算子過載中
若在賦值運算子過載中不返回*this,也就是物件本身,且不用&引用接收,將無法完成這樣的鏈式操作,和左移運算子相似
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 賦值運算子過載
c 賦值運算子過載,為什麼要返回引用?查了許多資料,基本有兩種說法 一 c c 賦值運算子的本意為 返回左值的引用 左值 賦值號左面的變數而非其值 可用以下程式段測試 int a,b 3,c 2 a b c cout 對於x y x,y均為物件時 若不返回左值的引用,將會生成臨時物件。如果不處理x ...
C 過載賦值運算子
c 類建立時,會產生乙個預設的賦值運算子函式 a operator const a 普通類例項之間賦值可能沒問題,但當類成員變數中有指標引用的動態記憶體時,複製後只是簡單地將指標值複製,而沒有將其指向的動態記憶體也拷貝乙份,這樣即多個類例項內的指標指向同一動態記憶體,當類例項析構時,會導致這塊動態記...