• <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 閱讀(715) 評論(0)  編輯 收藏 引用
            久久无码av三级| 精品久久人妻av中文字幕| 很黄很污的网站久久mimi色| 久久精品国产欧美日韩| 久久久久免费精品国产| 久久久久人妻一区精品性色av| 久久综合丁香激情久久| 天天综合久久一二三区| 久久久女人与动物群交毛片 | 99久久成人国产精品免费| 7国产欧美日韩综合天堂中文久久久久 | 久久精品国产一区| 久久一区二区免费播放| 久久亚洲AV成人出白浆无码国产| 99久久国产免费福利| 亚洲国产欧洲综合997久久| 大蕉久久伊人中文字幕| 久久久SS麻豆欧美国产日韩| 久久精品国产亚洲综合色| 精产国品久久一二三产区区别 | 日批日出水久久亚洲精品tv| 国产精品对白刺激久久久| 久久久午夜精品福利内容| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 精品综合久久久久久97超人| 久久影院久久香蕉国产线看观看| 日本欧美久久久久免费播放网| 久久亚洲国产精品成人AV秋霞| 久久精品综合一区二区三区| 国产精品伊人久久伊人电影| 久久精品人人做人人爽电影| 久久亚洲AV成人出白浆无码国产| 亚洲va中文字幕无码久久| 思思久久好好热精品国产| 思思久久99热免费精品6| 久久综合精品国产一区二区三区| A级毛片无码久久精品免费| 91久久精品国产91性色也| 久久se精品一区二区| 久久精品国产69国产精品亚洲| 精品久久久久久国产|