• <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>

            r2100

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              8 Posts :: 9 Stories :: 2 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(3)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜


            對于C++類:顯示地寫出拷貝構(gòu)造函數(shù),重載賦值操作符和析構(gòu)函數(shù)是良好的習(xí)慣,但在寫構(gòu)造函數(shù)時需要注意一些容易的錯誤,如下面的代碼:

             

            #include <iostream>

            using namespace std;

             

            class M{

            public:

                M()
            {}

                M(
            const M &m){

                   cout
            <<"copy construtor"<<endl;

                   
            operator =(m);

                }


                M 
            operator =(const M &m){   //問題出在此處

                   cout
            <<"operator ="<<endl;

                   
            return *this;

                }


            }
            ;

             

            int main() {

                M m1;

                M m2;

                m2
            =m1;

                
            return 0;

            }

             

            在下面三種情況下會調(diào)用拷貝構(gòu)造函數(shù):

            (1)用一個已經(jīng)實例化了的該類對象,去實例化該類的另外一個對象;

            (2)用該類的對象傳值的方式作為一個函數(shù)的參數(shù);

            (3)一個函數(shù)返回值為該類的一個對象。

            特別地,對于語句 M m;  M mm=m; 屬于(1)情況,即語句M mm=m;調(diào)用的是拷貝構(gòu)造函數(shù),而不是構(gòu)造函數(shù)。

             

            但在重載=操作符時,返回值不是引用類型將導(dǎo)致程序運行出現(xiàn)嚴(yán)重問題。即如果出現(xiàn)上面會調(diào)用拷貝構(gòu)造函數(shù)的三種情況之一,或者使用=操作符時,拷貝構(gòu)造函數(shù)和operator =將循環(huán)遞歸調(diào)用,導(dǎo)致程序出現(xiàn)死循環(huán)。原因是拷貝構(gòu)造函數(shù)和operator =之間不斷地重復(fù)調(diào)用。

            解決辦法:將operator =的返回類型改為引用類型M&,此時調(diào)用operator =時不會去調(diào)用拷貝構(gòu)造函數(shù)。

             

            還有,若要寫clone時,若通過下面的方式:

             

                M clone(){

                   cout
            <<"clone"<<endl;

                   
            return *this;

                }


            前提是拷貝構(gòu)造函數(shù)不能調(diào)用clone來完成拷貝,否則出現(xiàn)上面同樣的問題,下面的代碼就會出現(xiàn)這樣的問題

               

            M(const M &m){

                   cout
            <<"copy construtor"<<endl;

                   clone();

                }


            總之,在寫這些函數(shù)時,要特別留意彼此的調(diào)用關(guān)系。

            以下是我的慣用寫法:

            (A)對于拷貝構(gòu)造函數(shù)和重載=操作符

              

              M(const M &m){

                   cout
            <<"copy construtor"<<endl;

                   
            operator =(m);

                }


                M
            & operator =(const M &m){  //問題出在此處

                   cout
            <<"operator ="<<endl;

                   
            /* 此處寫上成員數(shù)據(jù)的拷貝 */

                   
            return *this;

                }


            這里寫成了inline函數(shù),只是方便說明問題,其實不必非要這么寫,可以采取先聲明,后定義的常規(guī)方法。

            (B)對于clone函數(shù)

            聲明:  virtual M clone();   //考慮繼承時的多態(tài)

            定義:  

            M M::clone(){

                   cout
            <<"clone"<<endl;

                   
            //將在調(diào)用處直接調(diào)用構(gòu)造函數(shù),效率高,避免返回局部變量,更安全

                   
            return M();

                }



             

            posted on 2011-04-06 13:18 r2100 閱讀(720) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品国产亚洲AV久| 久久精品国产亚洲AV麻豆网站| 日本久久中文字幕| 久久精品国产精品亚洲人人| 久久精品中文字幕第23页| 久久强奷乱码老熟女| 一本色道久久88—综合亚洲精品| 一本久久a久久精品综合夜夜 | 久久久久国产一级毛片高清板| 国产视频久久| 久久久久人妻一区精品果冻| 亚洲国产一成久久精品国产成人综合 | 青青热久久国产久精品| 亚洲精品久久久www| 97精品国产91久久久久久| 久久久久亚洲AV无码去区首| 亚洲国产精品无码久久SM| 久久久久久毛片免费看| 国产精品激情综合久久| 亚洲国产成人久久综合碰碰动漫3d | 国产99久久九九精品无码| 免费精品久久久久久中文字幕| 久久久久亚洲精品无码蜜桃| 一本一道久久精品综合| 久久久久女人精品毛片| 一级做a爰片久久毛片看看| 91久久精品无码一区二区毛片| 亚洲午夜久久久| 亚洲午夜精品久久久久久人妖| 久久久久亚洲精品日久生情| 国产精品久久久天天影视| 国内高清久久久久久| 中文字幕久久精品| 久久亚洲国产精品123区| 热久久这里只有精品| jizzjizz国产精品久久| 久久狠狠高潮亚洲精品| 99久久婷婷国产综合亚洲| 久久亚洲国产成人精品性色| 色综合久久中文字幕无码| 久久狠狠爱亚洲综合影院|