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

2022-03-20 14:40:47 字數 1228 閱讀 5291

**自:

class a

a(int id,char *t_name)

private:

char *username;

int _id;

}int main()

在程式編譯之後,a和b在stack上都被分配相應的記憶體大小。只不過物件a的域都被初始化,而b則都為隨機值。

其記憶體分配如下:

2. 預設情況下的賦值運算子

如果我們執行以下:

b=a;

則其執行的是預設定義的預設的賦值運算。所謂預設的賦值運算,是指物件中的所有位於stack中的域,進行相應的複製。但是,如果物件有位於heap上的域的話,其不會為拷貝物件分配heap上的空間,而只是指向相同的heap上的同乙個位址。

執行b=a這樣的預設的賦值運算後,其記憶體分配如下:

因此,對於預設的賦值運算,如果物件域內沒有heap上的空間,其不會產生任何問題。但是,如果物件域內需要申請heap上的空間,那麼在析構物件的時候,就會連續兩次釋放heap上的同一塊記憶體區域,從而導致異常。

~a()

3.解決辦法--過載(overload)賦值運算子

因此,對於物件的域在heap上分配記憶體的情況,我們必須過載賦值運算子。當物件間進行拷貝的時候,我們必須讓不同物件的成員域指向其不同的heap位址--如果成員域屬於heap的話。    

因此,過載賦值運算子後的**如下:

class a

a(int id,char *t_name)

a& operator =(a& a)

//注意:此處一定要返回物件的引用,否則返回後其值立即消失!

~a()

{cout<

1 過載賦值運算子返回結果為類物件的執行結果

明顯, 運算子最後呼叫了拷貝建構函式

2 過載賦值運算子返回結果為類物件引用的執行結果

很明顯,沒有呼叫拷貝建構函式

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

賦值運算子是雙目運算子,如果沒有使用者自定義的賦值運算子函式,那麼系統將自動地為其生成乙個預設的賦值運算子函式實現物件的賦值 complex c1 10,20 c2 就呼叫預設的賦值運算子函式,將物件c1的資料成員逐一拷貝到物件c2中,即 c2.real 20 c2.imag 10 雖然預設的賦值運...

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

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

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

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