C 深度解析 24 賦值運算子與深拷貝

2021-10-02 15:29:53 字數 2780 閱讀 6908

2 過載賦值操作符優化陣列類

3 小結

前面我們學習了操作符過載:在在

在我們現在有乙個問題:什麼時候需要過載賦值運算子?

下面我們進行程式設計實驗看一下深拷貝的意義:

#include

#include

using

namespace std;

class

test

test

(int i)

void

print()

~test()

};intmain()

上面的**很簡單,t2 = t1 時,使用編譯器預設的過載賦值運算子,這裡是淺拷貝,t1 和 t2 中的 m_pointer 都指向同一塊記憶體空間,t1,t2 生存期結束時,呼叫析構函式,釋放兩次空間,會引起程式崩潰。

如何修改呢,就是自己實現拷貝建構函式和賦值運算子,實現深拷貝。

#include

#include

using

namespace std;

class

test

test

(int i)

test

(const test& obj)

test&

operator=(

const test& obj)

// 返回值為型別引用,引數為const型別的引用

return

*this

;// 返回 *this

}void

print()

~test()

};intmain()

使用深拷貝,二者的位址空間不同,兩次析構釋放的是不同的位址空間

$ g++ 24-1.cpp -o 24-1

$ ./24-1

m_pointer = 0x90db008

m_pointer = 0x90db018

賦值操作符與拷貝建構函式有相同的存在意義,使用場合不同,t2 = t1 使用賦值操作符,t2(t1) 使用拷貝建構函式。意義是相同的。

過載賦值操作符需要注意四點(非常重要):

返回型別為類名的引用,這樣可以連續賦值

引數為 const 類名的引用

判斷相等,避免自我賦值

返回值為 *this

陣列類中有指標會申請記憶體空間,拷貝時發生的是淺拷貝,容易造成記憶體錯誤,這裡我們過載賦值操作符,實現深拷貝。另外這裡的拷貝建構函式為私有,類外無法呼叫,不需要過載了。

// intarray.h

#ifndef _intarray_h_

#define _inrarray_h_

class

intarray

;#endif

#include

"intarray.h"

#include

intarray::

intarray

(int len)

bool intarray::

construct()

}else

return ret;

}intarray* intarray::

newinstance

(int length)

return ret;

}int intarray::

length()

bool intarray::

get(

int index,

int& value)

return ret;

}bool intarray::

set(

int index,

int value)

return ret;

}int

& intarray::

operator

(int index)

intarray& intarray::

operator=(

const intarray& obj)

m_length = obj.m_length;

delete

m_pointer;

m_pointer = pointer;}}

return

*this;}

intarray& intarray::

self()

intarray::

~intarray()

// 24-2.cpp

#include

#include

"intarray.h"

using

namespace std;

intmain()

delete a;

delete b;

return0;

}

過載賦值運算子實現深拷貝,這樣物件使用賦值符號賦值就不會引起記憶體錯誤了。因為 不同物件指向的是不同的位址空間。

$ g++ 24-2.cpp intarray.cpp -o 24-2

$ ./24-2

array.length = 5

brray.length = 10

array.length = 10

brray.length = 10

1、需要深拷貝時必須過載賦值操作符

2、賦值操作符和拷貝建構函式有同等重要的意義

2 4 賦值運算子「 」

例1 某班a學員成績是80分,b學員與a學員成績相同,輸出b學員成績。1 int ascore 80 2int bscore 3 ascore bscore 4system.out.println bscore 56 改錯 7 1.bscore ascore 將右邊的值賦值給左邊的變數。8 2.in...

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...

C 賦值運算子

using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace 0219 賦值運算子 執行結果 x 11 x 2的運算結果...