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