1)乙個物件用於給另外乙個物件進行初始化(賦值初始化)
2)乙個物件作為函式引數,以值傳遞的方式傳入函式體
3)乙個物件作為函式返回值,以值傳遞的方式從函式返回
原則:對於凡是包含動態分配成員或包含指標成員的類都應該提供拷貝建構函式
對於第一種情況,先用乙個例子進行以下的說明:
//這個類的主要特點是包含指向其他資源的指標,pbuffer指向堆中動態分配的一段記憶體空間。
class cexample
~cexample()//析構函式
void init(int n) };
int _tmain(int argc, _tchar* argv)
語句"cexample theobjtwo = thobjone;"用theobjone初始化theobjtwo
此語句的具體過程:首先,建立物件theobjtwo,然後,呼叫其建構函式,然後,成員被複製初始化。
其完成方式是記憶體拷貝,複製所有成員的值。完成後,theobjtwo.pbuffer == theobjone.pbuffer
即,它們指向同樣的地方,指標雖然複製了,但所指向的空間並沒有複製,兒時由兩個物件共用了。這樣不符合要求,物件之間部隊裡了,並為空間的刪除帶來隱患。
這就是引入拷貝建構函式的初衷。
對於第二,第三種情況,如果不使用拷貝建構函式,就會導致乙個指標指向已經被刪除的記憶體空間。
第二種情況,物件按值傳遞:當物件直接作為引數傳給函式時,函式將簡歷物件的臨時拷貝,這個拷貝過程也將呼叫拷貝建構函式。
bool testfunc(cexample obj);
testfunc(theobjone);
bool testfunc(cexample obj)
{}
第三種情況:當函式中的區域性物件作為返回值被返回給函式呼叫者時,也將建立此區域性物件的乙個臨時拷貝,拷貝建構函式也將被呼叫。
ctest func()
格式:類名(const類名&物件名)------cexample(const cexample&);
引數是常量物件的引用。由於拷貝建構函式的目的是成員複製,不應修改原物件,所以建議使用const關鍵字
關於拷貝建構函式
首先不要使用vc編譯器來測試,看看這段 並猜想它會呼叫幾次建構函式和析構函式,最後再測試一下 在vc編譯執行後結果大失所望吧?不明白不要緊,vc這個整合的ide開發工具它的 博大精深 值得我們慢慢學習與積累,先看看下面我查詢的資料吧 一 拷貝建構函式 拷貝建構函式,是一種特殊的建構函式,它由編譯器呼...
關於構造,析構,拷貝建構函式,
1.建構函式 2.析構函式 3.拷貝建構函式 4.賦值語句 5.位址過載運算子 取址符 6.對const取物件的位址符 一.建構函式 1.關鍵字explicit 在建構函式前加上explicit時建構函式必須顯示呼叫 例如test是類名,有乙個test的建構函式,有兩個引數。若果加上關鍵字expli...
拷貝建構函式,預設拷貝建構函式
拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...