我們用物件
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...