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

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜


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

             

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

            }

             

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

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

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

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

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

             

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

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

             

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

             

                M clone(){

                   cout
            <<"clone"<<endl;

                   
            return *this;

                }


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

               

            M(const M &m){

                   cout
            <<"copy construtor"<<endl;

                   clone();

                }


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

            以下是我的慣用寫法:

            (A)對(duì)于拷貝構(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ù),只是方便說明問題,其實(shí)不必非要這么寫,可以采取先聲明,后定義的常規(guī)方法。

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

            聲明:  virtual M clone();   //考慮繼承時(shí)的多態(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 閱讀(715) 評(píng)論(0)  編輯 收藏 引用

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


            亚洲精品久久久www| 青青久久精品国产免费看| 久久伊人五月丁香狠狠色| 久久久精品波多野结衣| 国内精品久久国产大陆| 久久亚洲精品人成综合网| 亚洲愉拍99热成人精品热久久 | 免费久久人人爽人人爽av| 无码乱码观看精品久久| 香蕉aa三级久久毛片| 国产香蕉久久精品综合网| 亚洲人成无码久久电影网站| 一本久久a久久精品综合香蕉 | 精品久久久久久久久中文字幕| 久久99国产精品尤物| 日本精品久久久中文字幕| 精品无码久久久久久国产| 久久中文字幕视频、最近更新| 久久久网中文字幕| 99久久国产亚洲综合精品| 日韩av无码久久精品免费| 久久婷婷五月综合97色一本一本 | 久久久久亚洲?V成人无码| 久久精品国产精品亚洲下载| 日本欧美国产精品第一页久久| 久久精品一本到99热免费| av无码久久久久不卡免费网站| 亚洲国产精品久久久久| 亚洲精品97久久中文字幕无码| 久久精品国产第一区二区三区 | 久久久99精品成人片中文字幕| 午夜精品久久久内射近拍高清 | 狠狠色综合网站久久久久久久高清| 亚洲国产另类久久久精品黑人 | 丰满少妇人妻久久久久久| 久久精品国产一区二区| 日韩av无码久久精品免费| 久久综合久久伊人| 狠狠色丁香久久综合婷婷| 国产精品美女久久福利网站| 国产精品久久久久影院嫩草|