C 值賦值運算子過載

2021-07-12 04:04:32 字數 1408 閱讀 6030

c++值賦值運算子過載的格式是這樣的:

類名 & operator(const 類名 & 物件名)
同拷貝建構函式一樣,若沒有定義賦值運算子過載,則編譯器會自動生成乙個預設的賦值運算子過載, 編譯器自動生成預設賦值運算子過載同樣是等位賦值,也就是淺拷貝,會造成記憶體洩漏和重析構。重析構就不用說了,跟拷貝建構函式一樣。

那為什麼會記憶體洩漏呢?還是舉個例子加畫個圖來說明:

class a

};int main()

首先要明白賦值運算子過載是用乙個已經存在的物件賦值給另乙個已經存在的物件,而拷貝建構函式是用乙個已經存在的物件去建立另乙個不存在的物件,這兩者是不一樣的。那麼物件a和物件b都已經存在,也都分別開闢了空間,不只是為物件本身開闢了空間,因為構造器的關係,也同樣為成員變數c開闢了100的空間大小,像圖中所示:

然後因為:

b =a;
這麼一句**的關係,就變成了這樣:

那麼b同樣也指向了a物件為c開闢的空間位址,那麼b.c誰去釋放呢,那就沒人了,那麼這段記憶體空間就會造成記憶體洩漏,當釋放a和b時,a.c又被釋放了兩次,就是重析構,這就是編譯器自動生成的賦值運算子過載的弊端。

要避免上面出現的兩種情況,就應該使用深拷貝,那麼就要自定義賦值運算子過載。

a & operator=(const a & other)
要想不避免記憶體洩漏,就要在賦值之前,先把自己為成員變數開闢的空間釋放掉,要想避免重析構,就要再根據要複製的物件的長度再開闢一段自己的記憶體空間,再重新賦值就可以了。為了避免自賦值,把自己釋放掉,就無從複製的原因,要先判斷是否是自賦值。

上面的**中出現了this指標,就稍微提一下,this指標就是指向物件本身的乙個指標。

注意:

有了賦值運算子過載,就可以連等操作:

a

a, b, c;

a = b = c;

(a = b) = c;

上面兩種連等都是可以的,但如果賦值運算子過載的返回型別前面加了const,也就是這樣:

const a& operator=(const a & a){}
再執行:

(a =b) = c;
這樣就會報錯,因為c賦給了可以改變的a物件,這是不允許的,所以賦值運算子過載的返回型別一定要注意要不要加const。

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 普通類例項之間賦值可能沒問題,但當類成員變數中有指標引用的動態記憶體時,複製後只是簡單地將指標值複製,而沒有將其指向的動態記憶體也拷貝乙份,這樣即多個類例項內的指標指向同一動態記憶體,當類例項析構時,會導致這塊動態記...