【C++學習】複製建構函式和賦值運算子根本的不同

來源:互聯網
上載者:User

作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/

首先要說明的是,若使用者沒有定義,C++隱式聲明一個複製建構函式和一個賦值運算子(完成按資料成員複製的動作)。二者很像,但是在下邊這點上有很大的不同:複製建構函式是只在對象執行個體化時才會被調用,也就是說,在複製建構函式調用期間,這個對象處於一個未決狀態(直到複製建構函式被成功調用),另外複製建構函式不返回任何值,void都沒有。而賦值運算子則在一個現存的對象被賦予新的值時被調用,並且它有傳回值。

在下邊這個例子中我們能看到並不是出現“=”就是調用賦值建構函式:

#include 
using namespace std;
class Test
{
public:
 Test()
 {
  ctor_count++;
  cout<<"ctor "<
 }


 Test(const Test & r)


 {


  ctor_count++;


  cout<<"copy ctor "<
 }


 Test & operator= (const Test& r)


 {


  ctor_count++;


  cout<<"assignment op "<
  return *this;


 }


private:


 static int ctor_count; //only a declaration


};


int Test::ctor_count=0; // definition + initialization


int main()


{


    Test test;


    Test test1=test;


    Test test2(test);


    Test test3=test2=test1;


    return 0;


}



運行結果為




[root@localhost ~]# ./a.out

ctor 1

copy ctor 2

copy ctor 3

assignment op 4

copy ctor 5




我們看到執行個體化test對象時調用了預設建構函式,test1使用了複製建構函式(因為這是一個新的對象產生),test2時也是用了複製建構函式,而test2=test1則使用了賦值建構函式(沒有新的對象產生),test2=test3則使用了複製建構函式,原因同上。

 

所以要看是不是有新的對象產生,才能決定到底是調用了複製建構函式,還是賦值運算子。

作者:gnuhpc

出處:http://www.cnblogs.com/gnuhpc/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.