作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
首先要說明的是,若用戶沒有定義,C++隱式聲明一個復制構造函數和一個賦值運算符(完成按數據成員復制的動作)。二者很像,但是在下邊這點上有很大的不同:復制構造函數是只在對象實例化時才會被調用,也就是說,在復制構造函數調用期間,這個對象處於一個未決狀態(直到復制構造函數被成功調用),另外復制構造函數不返回任何值,void都沒有。而賦值運算符則在一個現存的對象被賦予新的值時被調用,並且它有返回值。
在下邊這個例子中我們能看到並不是出現“=”就是調用賦值構造函數:
#includeusing 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 + initializationint 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則使用了復制構造函數,原因同上。
所以要看是不是有新的對象產生,才能決定到底是調用了復制構造函數,還是賦值運算符。