• <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)  編輯 收藏 引用
            久久综合亚洲色一区二区三区| 久久久国产精华液| 欧美伊香蕉久久综合类网站| 免费精品99久久国产综合精品| 久久久久亚洲AV成人网人人软件| 合区精品久久久中文字幕一区| 97精品伊人久久久大香线蕉| 久久中文字幕一区二区| 亚洲国产精品成人久久蜜臀 | 久久精品国产99久久久| 91麻精品国产91久久久久| 偷窥少妇久久久久久久久| 97久久久精品综合88久久| 中文字幕精品无码久久久久久3D日动漫| 无码精品久久久天天影视| 久久精品国产亚洲一区二区三区| 无码人妻久久久一区二区三区 | 国产人久久人人人人爽| 国产精品成人无码久久久久久 | 国产亚州精品女人久久久久久| 国产色综合久久无码有码| 久久久久国产日韩精品网站| 国产婷婷成人久久Av免费高清| 亚洲国产成人乱码精品女人久久久不卡 | 曰曰摸天天摸人人看久久久| 亚洲∧v久久久无码精品| 久久狠狠爱亚洲综合影院 | 少妇精品久久久一区二区三区| 久久综合色之久久综合| 久久黄色视频| 精品久久久久久无码国产| 99久久精品免费国产大片| 久久国产高清字幕中文| 久久99热狠狠色精品一区| 99精品久久久久中文字幕| 久久91精品国产91久久户| 99精品久久久久久久婷婷| 中文字幕一区二区三区久久网站 | 99久久亚洲综合精品网站| 爱做久久久久久| 久久av高潮av无码av喷吹|