【C++學習】復制構造函數和賦值運算符根本的不同


作者: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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM