• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            brent's hut

            C++拷貝構(gòu)造函數(shù)深入分析以及重寫(xiě)operator =

            ?

            class ?CTestCopyConstruct {
            public :
            ????CTestCopyConstruct()
            {
            ????????TRACE(
            " Enter?CTestCopyConstruct();this?is?%d\n " , this );
            ????????strTest?
            = ? " not?ok " ;
            ????????i?
            = ? 0 ;
            ????}

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

            ????CTestCopyConstruct?
            & ?operator? = ( const ?CTestCopyConstruct? & ?src) {
            ????????TRACE(
            " Enter?CTestCopyConstruct?&?operator?=(const?CTestCopyConstruct?&?src);this?is?%d;src?is?%d\n " , this , & src);
            ????????strTest?
            = ?src.strTest;
            ????????i?
            = ?src.i;
            ????????
            return ? * this ;
            ????}

            ????CString?strTest;
            ????
            int ?i;
            }
            ;

            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í)行如下:
            當(dāng)前堆棧指針(sp) = 1242980
            sp -= 8//在堆棧中為var1分配空間
            在var1上(1242980 - 1242973)調(diào)用構(gòu)造函數(shù)
            sp -= 8//在堆棧中為var2分配空間
            sp -= n//保護(hù)當(dāng)前環(huán)境
            進(jìn)入了GetTest函數(shù)
            當(dāng)前sp = 1242848
            sp -= 8//為ret1分配空間
            構(gòu)建ret1
            sp -= 8//為ret2分配空間
            構(gòu)建ret2
            ......
            對(duì)var2(1242972處的堆棧段)調(diào)用拷貝構(gòu)造函數(shù),以test1(1242848處)為參數(shù)
            //析構(gòu)test1 test2等...
            sp += n//恢復(fù)運(yùn)行環(huán)境
            ......

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

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

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

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




            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);


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


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

            posted on 2006-03-30 10:34 brent 閱讀(1589) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++

            日韩久久久久中文字幕人妻| 99久久国产热无码精品免费久久久久 | 国产精品成人久久久久三级午夜电影| 久久精品国产亚洲精品2020 | 久久亚洲精品中文字幕| 久久久久亚洲AV片无码下载蜜桃| 777米奇久久最新地址| 久久久综合九色合综国产| 久久www免费人成精品香蕉| 久久人人添人人爽添人人片牛牛| 亚洲色大成网站WWW久久九九| 久久被窝电影亚洲爽爽爽| 中文精品久久久久人妻| 国产美女久久精品香蕉69| 亚洲国产成人精品无码久久久久久综合| 久久亚洲精品无码观看不卡| 久久精品亚洲精品国产色婷| 国内精品欧美久久精品| 久久精品亚洲AV久久久无码| 国产精品女同一区二区久久| 亚洲va久久久久| 99久久精品免费| 国产日产久久高清欧美一区| 久久久一本精品99久久精品88| 99久久亚洲综合精品成人| 久久亚洲国产精品成人AV秋霞| 国产免费久久久久久无码| 国产精品99久久久久久人| 欧美大香线蕉线伊人久久| 色综合久久久久综合99| 久久国产精品免费| 国内精品伊人久久久久网站| 国产精品久久精品| 成人国内精品久久久久一区| 亚洲欧洲日产国码无码久久99| 亚洲午夜精品久久久久久app| 精品国产综合区久久久久久| 久久综合久久综合久久| 97久久精品无码一区二区天美| 久久成人国产精品| 久久精品国产亚洲AV电影|