拷貝建構函式 深cop與淺copy

2021-10-07 14:18:44 字數 2807 閱讀 3202

在乙個類物件的定義過程中,物件初始化分為兩種:

1)、直接初始化,要求編譯器使用普通的函式匹配,選擇我們提供的最匹配的建構函式

2)、拷貝初始化,要求編譯器將右側運算物件拷貝到正在建立的物件中,通常使用拷貝建構函式來完成。

//直接初始化,使用string的建構函式string (size_t n, char c);

string dots(10

,'s');

//直接初始化,使用拷貝建構函式string (const string& str);

string s

(dots)

;//使用拷貝賦值運算子,拷貝初始化,使用拷貝建構函式string (const string& str);

string s1 = dots;

//拷貝初始化

string null_book =

"9-99-999"

;//拷貝初始化

string nines =

string(10

,'s'

);

在物件拷貝過程中,如果沒有自定義拷貝建構函式,系統會提供乙個預設的拷貝建構函式,進行的是淺拷貝!

即使定義了其它建構函式,編譯器也會合成乙個拷貝建構函式,即合成拷貝建構函式。

class

foo

乙個拷貝建構函式的構成:

1、乙個建構函式的第乙個引數是自身型別的引用

2、且任何額外引數都有預設值

拷貝初始化的使用場景:

1、將乙個物件作為實參傳遞給乙個非引用型別的形參

class

foofoo

(int p, foo* nex):a

(p),

next

(nex)

foo(

const foo& p):a

(p.a)

,next

(p.next)

~foo()

=default

;void

copy1

(foo s)

;void

copy

(foo& s);

foo*

out();

foo out2()

;};void foo::

copy1

(foo s)

//實參到形參,呼叫拷貝建構函式

//實參到形參發生的拷貝中,next是一次淺拷貝

//next訪問的仍是實參next指向的記憶體

void foo::

copy

(foo& s)

//只是引用,未呼叫拷貝建構函式

2、從乙個返回型別為非引用型別的函式返回乙個物件

foo* foo::

out(

)//返回的this指標賦值給新指標時,呼叫拷貝建構函式

foo foo::

out2()

//返回值會被賦值給乙個物件,使用拷貝建構函式

3、用花括號列表初始化乙個陣列中的元素或乙個聚合類中的成員

foo nin(9

, six)

;//使用建構函式,構造新物件

foo ten =

;//使用列表初始化格式對應的建構函式建立臨時物件

//再呼叫拷貝建構函式

在定義拷貝建構函式時,會發生不同性質的拷貝過程,主要分為深拷貝和淺拷貝。

foo

(const foo& p):a

(p.a)

,next

(p.next)

//淺拷貝

foo(

const foo& p)

//深拷貝

其特點為:

淺拷貝只是對指標的拷貝,拷貝後兩個指標指向同乙個記憶體空間。

深拷貝不但對指標進行拷貝,而且對指標指向的內容進行拷貝,經深拷貝後的指標是指向兩個不同位址的指標。

可以支援移動操作,需要定義移動建構函式和移動賦值運算子。

會將給定物件的資源「竊取」,而不是拷貝資源。

一旦完成資源移動,源物件必須不在指向被移動的資源。

foo

(const foo&& p):a

(p.a)

,next

(p.next)

//移動拷貝

該類型別的右值引用。

左值與右值的區別

左值持久,右值短暫

1、所引用的物件將要被銷毀,字面值常量或者臨時變數

2、該物件沒有其它使用者

左值是變數,右值不能被賦值

左值引用與右值引用

右值引用是為了支援移動操作,通過&&來獲得右值引用。

右值引用可以自由接管所引用物件的資源。

c++11新特性:std::move(),可以將乙個左值轉換為對應的右值引用型別。

左值引用是相對於右值引用的,通過&來獲得。

左值引用指向源物件的資源。

可以定義左值引用自己的寫許可權。

比如const引用就不可以修改源物件的值。

python學習筆記 (六)深copy 淺copy

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用。賦值其實只是傳遞物件引用,引用物件id是一樣的。原始列表改變,被賦值的b也會做相同的改變。alist 1,2,3,a b b alist print...

拷貝建構函式,深拷貝與淺拷貝

一.拷貝建構函式 先直接來看 include include help.h using namespace std class line private char msg line line const char msg line line const line line line line voi...

C 淺拷貝與深拷貝建構函式

include using namespace std 淺拷貝和深拷貝區別 1.淺拷貝,若類中不存在拷貝建構函式,會提供預設拷貝建構函式 淺拷貝 可以進行物件值賦值 但當資料成員中存在需要在堆區申請空間時,析構時淺拷貝會造成空間雙重釋放問題 2.深拷貝,當資料成員中存在需要在堆區申請空間時,會呼叫深...