C 移動建構函式和拷貝建構函式

2021-09-26 18:54:59 字數 1441 閱讀 1728

我們用物件

a初始化物件b

,後物件

a我們就不在使用

了,但是物件a的空間還在呀(在析構之前),既然拷貝建構函式,實際上就是把a物件的內容複製乙份到b中,那麼為什麼我們不能直接使用a的空間呢?這樣就避免了新的空間的分配,大大降低了

構造的成本

。這就是移動建構函式設計的初衷;

拷貝建構函式

中,對於指標,我們一定要

採用深層複製

,而移動建構函式

中,對於指標,我們採用

淺層複製

。淺層複製

之所以危險,是因為

兩個指標共同指向一片記憶體空間

,若第乙個指標將其釋放,另乙個指標的指向就不合法了。所以我們只要

避免第乙個指標釋放空間

就可以了。避免的方法就是將第乙個指標(比如a->value)置為null,這樣在呼叫析構函式的時候,由於有判斷是否為null的語句,所以析構a的時候並不會**a->value指向的空間;

移動建構函式的引數和拷貝建構函式不同,

拷貝建構函式

的引數是乙個

左值引用

,但是移動建構函式

的初值是乙個

右值引用

。意味著,移動建構函式的引數是乙個右值或者將亡值的引用。也就是說,只用用乙個右值,或者將亡值初始化另乙個物件的時候,才會呼叫移動建構函式。而那個

move

語句,就是將乙個左值變成乙個將亡值

#include#includeusing namespace std;

class test

{public:

test(int num,char *ptr)

{ x = num; p = ptr;

cout << "建構函式"輸出:

建構函式

拷貝建構函式

移動建構函式

b.p和c.p指向同乙個記憶體,因為都是淺複製。有指標成員變數時,拷貝建構函式要深複製(自動生成的拷貝建構函式是淺複製)

#include#includeusing namespace std;

class test

{public:

test(int num,char *ptr)

{ x = num; p = ptr;

cout << "建構函式"<

b的p成員的值與a不同,c的p值與a.p相同

拷貝建構函式和移動建構函式解析

by gongzhihui 2017.12.5 拷貝構造函式呼叫時機 1.物件作為函式引數 2.物件作為函式返回值 3.用乙個物件初始化另乙個物件 t t1 t t2 ti t t3 t1 此處的 不是賦值運算子 拷貝賦值運算子 t t1 t t2 t1 t2 除了 類名 物件 物件 外的 應該都是...

c 建構函式和拷貝建構函式

c 中為什麼要使用建構函式?c 是從c演變過來的,c中存在的是結構體,例如 對點point struct point 但是對點的操作還要在外部使用函式來實現。c 中包括了成員屬性和成員方法,但是由於類的封裝性,不能像普通變數乙個對成員屬性就行初始化,所以使用建構函式。class point doub...

C 建構函式 拷貝建構函式

建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...