賦值運算子過載和拷貝建構函式的作用類似,都是將類物件進行複製。
需要注意的點也是一樣,就是堆區重複釋放問題
這個問題的誘因就是,編譯器預設的拷貝是淺拷貝,而淺拷貝會出現重複釋放記憶體的現象。
具體可以參考 c++深拷貝與淺拷貝
賦值運算子過載的目的就是複製類,而每個類的內容不盡相同
所以,賦值運算子過載應該定義在類內部
賦值運算子過載(淺拷貝)
編譯器提供的**是淺拷貝。
此時不能自己定義析構函式,否則會帶來堆區重複釋放的問題。
#include
using
namespace std;
#include
class
person
//過載賦值運算子
//安利乙個tip
//在不知道返回值型別的時候可以用void代替,
//等到定義完畢後再修改返回值型別即可
void
operator
=(person &p)
//編譯器提供的**是淺拷貝
m_age = p.m_age;
}//此時不能自己定義析構函式,否則會帶來堆區重複釋放的問題
//~person()
////}
//年齡的指標
int*m_age;};
void
test01()
intmain()
賦值運算子過載(深拷貝)
提供深拷貝 解決淺拷貝堆區重複釋放的問題
#include
using
namespace std;
#include
class
person
//過載賦值運算子
void
operator
=(person &p)
編譯器提供的**是淺拷貝
//m_age = p.m_age;
//提供深拷貝 解決淺拷貝的問題
m_age =
newint
(*p.m_age);}
~person()
}//年齡的指標
int*m_age;};
void
test01()
intmain()
解決連續賦值問題
曾記否,我們原來的賦值運算有這樣連續賦值的形式
int a =10;
int b =20;
int c =30;
c = b = a;
#include
using
namespace std;
#include
class
person
//過載賦值運算子
person&
operator
=(person &p)
編譯器提供的**是淺拷貝
//m_age = p.m_age;
//提供深拷貝 解決淺拷貝的問題
m_age =
newint
(*p.m_age)
;//返回自身
return
*this;}
~person()
}//年齡的指標
int*m_age;};
void
test01()
intmain()
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 普通類例項之間賦值可能沒問題,但當類成員變數中有指標引用的動態記憶體時,複製後只是簡單地將指標值複製,而沒有將其指向的動態記憶體也拷貝乙份,這樣即多個類例項內的指標指向同一動態記憶體,當類例項析構時,會導致這塊動態記...