複製建構函式必須將形參指定為 const 引用
若複製建構函式寫成如下:
cbox(cbox initb);
由於是按值傳遞,所以編譯器會首先建立物件的副本,而建立物件的副本需要呼叫複製建構函式,又會建立新的物件,新物件又會呼叫複製建構函式
會持續不休,最終得到對複製建構函式的無窮呼叫。
解決方法如下:
cbox(const cbox & initb);
由於是引用形參,因此沒有複製發生,const 限定符用來確保該函式不能修改實參。
classcmessage
//建構函式
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 物件的資料成員也被釋放了。
下面**依舊同樣的問題:
classcmessage
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是用於儲存浮點數型別的。但是變數宣告的意義不只是這個,另乙個同樣重要的...