• <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++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              8 Posts :: 9 Stories :: 2 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(3)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜


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

             

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

            }

             

            在下面三種情況下會調用拷貝構造函數:

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

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

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

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

             

            但在重載=操作符時,返回值不是引用類型將導致程序運行出現嚴重問題。即如果出現上面會調用拷貝構造函數的三種情況之一,或者使用=操作符時,拷貝構造函數和operator =將循環遞歸調用,導致程序出現死循環。原因是拷貝構造函數和operator =之間不斷地重復調用。

            解決辦法:將operator =的返回類型改為引用類型M&,此時調用operator =時不會去調用拷貝構造函數。

             

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

             

                M clone(){

                   cout
            <<"clone"<<endl;

                   
            return *this;

                }


            前提是拷貝構造函數不能調用clone來完成拷貝,否則出現上面同樣的問題,下面的代碼就會出現這樣的問題

               

            M(const M &m){

                   cout
            <<"copy construtor"<<endl;

                   clone();

                }


            總之,在寫這些函數時,要特別留意彼此的調用關系。

            以下是我的慣用寫法:

            (A)對于拷貝構造函數和重載=操作符

              

              M(const M &m){

                   cout
            <<"copy construtor"<<endl;

                   
            operator =(m);

                }


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

                   cout
            <<"operator ="<<endl;

                   
            /* 此處寫上成員數據的拷貝 */

                   
            return *this;

                }


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

            (B)對于clone函數

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

            定義:  

            M M::clone(){

                   cout
            <<"clone"<<endl;

                   
            //將在調用處直接調用構造函數,效率高,避免返回局部變量,更安全

                   
            return M();

                }



             

            posted on 2011-04-06 13:18 r2100 閱讀(720) 評論(0)  編輯 收藏 引用
            国产精品美女久久久久久2018| 亚洲伊人久久精品影院| 精品国产乱码久久久久软件| 蜜臀av性久久久久蜜臀aⅴ麻豆| 手机看片久久高清国产日韩| 9999国产精品欧美久久久久久| 久久综合久久久| 日本亚洲色大成网站WWW久久| 久久久久国产成人精品亚洲午夜| 精品久久久久久久久久中文字幕 | 国产精品免费看久久久香蕉| 精产国品久久一二三产区区别| 亚洲中文字幕无码一久久区| 久久久久久一区国产精品| 久久亚洲视频| 国产午夜精品久久久久免费视| 伊人久久综合热线大杳蕉下载| 久久免费观看视频| 99久久无色码中文字幕| 久久久久国产一级毛片高清板| 久久亚洲精品无码VA大香大香| 91久久精一区二区三区大全| 久久精品国产福利国产秒| 蜜桃麻豆www久久国产精品| 一本久久a久久精品vr综合| 国内精品久久国产大陆| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久午夜夜伦鲁鲁片免费无码影视| 国产高潮国产高潮久久久| 久久se精品一区二区影院| 香蕉久久av一区二区三区| 久久综合九色综合久99| 久久最新免费视频| 国产亚洲成人久久| 久久青草国产手机看片福利盒子| 国产精品一区二区久久精品涩爱 | 人人狠狠综合久久亚洲婷婷| 久久男人中文字幕资源站| 国产精品毛片久久久久久久| 久久久久久青草大香综合精品 | 99久久精品国产麻豆|