• <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 閱讀(731) 評論(0)  編輯 收藏 引用
            亚洲欧美成人综合久久久| 久久精品人人做人人爽电影| 久久综合九色综合欧美就去吻| 久久99精品国产99久久| 久久se精品一区精品二区国产| 女人高潮久久久叫人喷水| 国产美女久久精品香蕉69| 国产综合精品久久亚洲| 久久99精品久久久大学生| 国产精品va久久久久久久| 色播久久人人爽人人爽人人片AV| …久久精品99久久香蕉国产| 亚洲精品综合久久| 国产成人无码精品久久久久免费| 中文精品99久久国产| 国产精品亚洲美女久久久| 日韩乱码人妻无码中文字幕久久| 无码国产69精品久久久久网站| 久久99国产一区二区三区| 国内精品久久久久| 国内精品人妻无码久久久影院| 狠狠色婷婷久久综合频道日韩 | 狠狠精品干练久久久无码中文字幕| 久久大香萑太香蕉av| 久久精品国产99久久久香蕉| 日本免费一区二区久久人人澡| 亚洲AV无码成人网站久久精品大| 久久精品无码一区二区三区日韩| 亚洲国产天堂久久综合网站| 无码AV波多野结衣久久| 久久亚洲AV成人无码国产| 日韩人妻无码一区二区三区久久99| 中文字幕精品无码久久久久久3D日动漫| 国产99久久久久久免费看| 91精品国产91久久| 精品无码久久久久久国产| 久久久久成人精品无码 | 一本久久a久久精品亚洲| 伊人伊成久久人综合网777| 久久九九兔免费精品6| 亚洲伊人久久精品影院|