物件 複製建構函式

2022-05-30 17:30:10 字數 1527 閱讀 8475

複製建構函式必須將形參指定為 const 引用

若複製建構函式寫成如下:

cbox(cbox initb);

由於是按值傳遞,所以編譯器會首先建立物件的副本,而建立物件的副本需要呼叫複製建構函式,又會建立新的物件,新物件又會呼叫複製建構函式

會持續不休,最終得到對複製建構函式的無窮呼叫。

解決方法如下:

cbox(const cbox & initb);

由於是引用形參,因此沒有複製發生,const 限定符用來確保該函式不能修改實參。

class

cmessage

//建構函式

cmessage(

const

char* text="

default message")

;m_pmessage = new

char[length+1

]; strcpy_s(m_pmessage,length+1

,text);

}//析構函式

~cmessage()

};void

displaymessage(cmessage localmsg)

intmain()

; displaymessage(thought);

thought.showit();

return0;

}

執行上面程式我們會發現出現異常,原因是因為在 displaymessage(cmessage localmsg) 函式呼叫中按值傳遞建立了實參的副本,

而由於使用預設複製建構函式,物件和物件的副本的資料成員 m_pmessage,共同指向同一塊記憶體區域。

displaymessage(cmessage localmsg)函式中的物件副本在離開函式後便呼叫析構函式用 deletem_pmessage 釋放了記憶體。

所以 thought 物件的資料成員也被釋放了。

下面**依舊同樣的問題:

class

cmessage

cmessage(

const

char* text="

default message")

;m_pmessage = new

char[length+1

]; strcpy_s(m_pmessage,length+1

,text);

}~cmessage()

};int

main()

; cmessage motto2;

return0;

}

解決辦法:建立自己的複製建構函式

cmessage(const cmessage &amess)

;

this->m_pmessage = new

char

[len];

strcpy_s(m_pmessage,len,amess.m_pmessage);

}

類與物件 複製建構函式

二進位制複製不複製指向的記憶體單元,這導致兩個 mystring 物件指向同乙個記憶體單元。函式 usemystring 返回時,變數 str 不再在作用域內,因此被銷毀。為此,將呼叫 mystring 類的析構函式,而該析構函式使用 delete釋放分配給 buffer 的記憶體,這將導致 mai...

類和物件 複製建構函式

形如x x x 或x x const x 二選一,後者能以常量物件作為引數 class complex complex c1 呼叫預設無參建構函式 complex c2 c1 呼叫預設的複製建構函式,將 c2 初始化成和c1一樣class complex complex const complex ...

c 類與物件(1) 構造,複製建構函式

當我們定義乙個基本型別變數時,方法如下 int p 定義乙個int型別變數 bool b 定義乙個bool型別變數 float c 定義乙個float型別變數 顯然定義變數p適用於儲存整數型別的,變數b是用於儲存布林型別的,變數c是用於儲存浮點數型別的。但是變數宣告的意義不只是這個,另乙個同樣重要的...