溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進行C++拷貝構(gòu)造函數(shù)深入分析以及重寫operator

發(fā)布時間:2021-10-14 15:59:23 來源:億速云 閱讀:98 作者:柒染 欄目:編程語言

這篇文章將為大家詳細講解有關(guān)如何進行C++拷貝構(gòu)造函數(shù)深入分析以及重寫operator ,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

 

CTestCopyConstruct GetTest()  {
CTestCopyConstruct ret1;
ret1.strTest  =   " ok " ;
ret1.i  =   0 ;
CTestCopyConstruct ret2;
return  ret1;
}

void  CTestDlg::OnOK()
 {
CTestCopyConstruct var1;
CTestCopyConstruct var2  =  GetTest();

TRACE( " /nresult 1:/n " );
TRACE( " var1 is %d/n " , & var1);
TRACE( " var2 is %d var2.str is %s/n/n " , & var2,var2.strTest);

CTestCopyConstruct var3  =  var2;
CTestCopyConstruct var4;
var4  =  var2;

TRACE( " /nresult 2:/n " );
TRACE( " var3 is %d var3.str is %s/n " , & var3,var3.strTest);
TRACE( " var4 is %d var2.str is %s/n " , & var4,var4.strTest);
}

 代碼如上,調(diào)試窗口輸出如下:
Enter CTestCopyConstruct();this is 1242980
Enter CTestCopyConstruct();this is 1242848
Enter CTestCopyConstruct();this is 1242840
Enter CTestCopyConstruct(const CTestCopyConstruct &src);this is 1242972;src is 1242848

result 1:
var1 is 1242980
var2 is 1242972 var2.str is ok

Enter CTestCopyConstruct(const CTestCopyConstruct &src);this is 1242964;src is 1242972
Enter CTestCopyConstruct();this is 1242956
Enter CTestCopyConstruct & operator =(const CTestCopyConstruct & src);this is 1242956;src is 1242972

result 2:
var3 is 1242964 var3.str is ok
var4 is 1242956 var2.str is ok

分析:
CTestCopyConstruct var1;//1
CTestCopyConstruct var2 = GetTest();//2
代碼的執(zhí)行如下:
當前堆棧指針(sp) = 1242980
sp -= 8//在堆棧中為var1分配空間
在var1上(1242980 - 1242973)調(diào)用構(gòu)造函數(shù)
sp -= 8//在堆棧中為var2分配空間
sp -= n//保護當前環(huán)境
進入了GetTest函數(shù)
當前sp = 1242848
sp -= 8//為ret1分配空間
構(gòu)建ret1
sp -= 8//為ret2分配空間
構(gòu)建ret2
......
對var2(1242972處的堆棧段)調(diào)用拷貝構(gòu)造函數(shù),以test1(1242848處)為參數(shù)
//析構(gòu)test1 test2等...
sp += n//恢復運行環(huán)境
......

另:
operater = () 和默認構(gòu)造函數(shù)不一樣,只重寫=運算符而不提供拷貝構(gòu)造函數(shù),調(diào)用的仍然是默認的構(gòu)造函數(shù)。
默認構(gòu)造函數(shù)和賦值運算符處理的情況不一樣,一個是在已分配的空間上調(diào)用,一個是在已構(gòu)造的對象上調(diào)用。

默認拷貝構(gòu)造函數(shù)會調(diào)用類中各成員的拷貝構(gòu)造函數(shù)。CString 由于提供了拷貝構(gòu)造函數(shù),所以上面例子中即使去掉拷貝構(gòu)造函數(shù),var2 仍然會得到正確的值。

調(diào)試的環(huán)境是vc6.0 debug 默認選項。編譯沒有優(yōu)化。

CTestCopyConstruct( const  CTestCopyConstruct  & src)
:strTest (src.strTest)  {
TRACE( " Enter CTestCopyConstruct(const CTestCopyConstruct &src);this is %d;src is %d/n " , this , & src);
i  =  src.i;
}

前者先調(diào)用了CString::CString()再調(diào)用CString::operator =
后者直接調(diào)用了CString::CString(CString & src);

默認的賦值運算的行為:首先調(diào)用父類的賦值運算。
然后會為自己獨有的各成員尋找賦值運算。如果成員的賦值運算符被重寫,則調(diào)用這個重寫的賦值運算符函數(shù),如果這個重寫的運算符函數(shù)是private,編譯將無法通過。
默認的拷貝構(gòu)造函數(shù)的行為:首先調(diào)用父類的拷貝構(gòu)造函數(shù)。
然后為自己獨有的各成員尋找拷貝構(gòu)造函數(shù)。如果這個成員提供拷貝構(gòu)造函數(shù),則調(diào)用之,如果成員的類提供的拷貝構(gòu)造函數(shù)是private,編譯將無法通過。
(子類完全可以把父類當成自己的一個成員?)

可以說默認的賦值運算和默認的拷貝構(gòu)造函數(shù)是類最常被用到的兩個函數(shù)了...內(nèi)部卻不是一般的復雜。

關(guān)于如何進行C++拷貝構(gòu)造函數(shù)深入分析以及重寫operator 就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI