賦值運算子「 」的過載 (淺拷貝與深拷貝)

2021-08-03 17:55:44 字數 986 閱讀 7922

賦值運算子是雙目運算子,如果沒有使用者自定義的賦值運算子函式,那麼系統將自動地為其生成乙個預設的賦值運算子函式實現物件的賦值

complex c1(10,20),c2;

就呼叫預設的賦值運算子函式,將物件c1的資料成員逐一拷貝到物件c2中,即

c2.real=20;

c2.imag=10;

雖然預設的賦值運算子函式能夠實現很多拷貝,但是有很多時候它是不行的,這時需要自己對賦值運算子進行過載

淺拷貝產生的指標懸掛問題     

淺拷貝:通過物件之間的一一賦值,使得物件中的指標指向同一塊記憶體,使得出現了以下三個問題:(1.兩次析構同一塊記憶體,系統崩潰;2.修改乙個位址造成其他的物件成員被修改;3.當刪除乙個指標指向的內容,則另乙個物件不能正常訪問該指標指向記憶體中的內容。

在淺拷貝中,是簡單的賦值給另乙個成員,如果裡面有指標,則導致兩個物件的指標指向相同的記憶體。由於指標在兩個物件例指向相同的變數,當乙個物件改變的時候則另乙個物件會跟著改變。另一方面,我們不知道究竟由誰在負責析構指標開闢的堆記憶體,這樣就會出現一下錯誤。調析構函式則析構兩次,破壞記憶體;不呼叫析構則沒有析構,造成記憶體洩露。

#include

#include

using namespace std;

class string

int main()

{string p1("book");

string p2("jeep");

p2=p1;      //@     p2=p1相當於p2.operator=(p1);

return 0;

和#include

C 中賦值運算子過載以及深拷貝淺拷貝解析

自 class a a int id,char t name private char username int id int main 在程式編譯之後,a和b在stack上都被分配相應的記憶體大小。只不過物件a的域都被初始化,而b則都為隨機值。其記憶體分配如下 2.預設情況下的賦值運算子 如果我們...

C 類的賦值運算子 的過載,以及深拷貝和淺拷貝

c 本質 類的賦值運算子 的過載,以及深拷貝和淺拷貝 在物件導向程式設計中,物件間的相互拷貝和賦值是經常進行的操作。如果物件在申明的同時馬上進行的初始化操作,則稱之為拷貝運算。例如 class1 a af class1 b a 此時其實際呼叫的是b a 這樣的淺拷貝操作。如果物件在申明之後,在進行的...

C 運算子過載問題以及涉及的深拷貝與淺拷貝的問題

我們都對於 等等運算子 操作符 很熟悉,中天天敲這些東西。但是我們知道這些操作符都只能對基本型別進行運算,比如int,double什麼的。現在我們學習了c 每天都寫了很多類,物件,但是有一件事情很苦惱,那就是我們想對類物件來實現以前運算子所能實現的功能時就必須寫成員函式或者普通函式來呼叫函式,但是這...