‘=’只有在賦值時,才調用賦值函數,當在聲明變量時,B b3=b1和B b4(b3)調用的函數是一樣的,均爲拷貝構造函數。
拷貝構造,是一個的對象來初始化一邊內存區域,這邊內存區域就是你的新對象的內存區域賦值運算,對於一個已經被初始化的對象來進行operator=操作
class A;
A a;
A b=a; //拷貝構造函數調用
//或
A b(a); //拷貝構造函數調用
///////////////////////////////////
A a;
A b;
b =a; //賦值運算符調用
String s2(s1);
String s3 = s1;
只是語法形式的不同,意義是一樣的,都是定義加初始化,都調用拷貝構造函數。
一般來說是在數據成員包含指針對象的時候,應付兩種不同的處理需求的 :
一種是複製指針對象,
一種是引用指針對象 copy大多數情況下是複製,=則是引用對象的
例子:
class A
{
int nLen;
char * pData;
}
顯然
A a, b;
a=b的時候,對於pData數據存在兩種需求
第一種copy
a.pData = new char [nLen];
memcpy(a.pData, b.pData, nLen);
另外一種(引用方式):
a.pData = b.pData
通過對比就可以看到,他們是不同的
往往把第一種用copy使用,第二種用=實現
和拷貝構造函數的實現不一樣
拷貝構造函數首先是一個構造函數,它調用的時候產生一個對象,是通過參數傳進來的那個對象來初始化,產生的對象。
operator=();是把一個對象賦值給一個原有的對象,所以如果原來的對象中有內存分配要先把內存釋放掉,而且還要檢查一下兩個對象是不是同一個對象,如果是的話就不做任何操作。
{
public:
CExample(){pBuffer=NULL; nSize=0;}
~CExample(){delete pBuffer;}
void Init(int n){ pBuffer=new char[n]; nSize=n;}
private:
char *pBuffer; //類的對象中包含指針,指向動態分配的內存資源
int nSize;
};
{
CExample theObjone;
theObjone.Init(40);
//現在需要另一個對象,需要將他初始化稱對象一的狀態
CExample theObjtwo=theObjone;
...
}
{
public:
CExample(){pBuffer=NULL; nSize=0;}
~CExample(){delete pBuffer;}
CExample(const CExample&); //拷貝構造函數
void Init(int n){ pBuffer=new char[n]; nSize=n;}
private:
char *pBuffer; //類的對象中包含指針,指向動態分配的內存資源
int nSize;
};
{
nSize=RightSides.nSize; //複製常規成員
pBuffer=new char[nSize]; //複製指針指向的內容
memcpy(pBuffer,RightSides.pBuffer,nSize*sizeof(char));
}
1 定義新對象,並用已有對象初始化新對象時,CExample(const CExample& RightSides)將被調用,而已有對象用別名RightSides傳給構造函數,以用來作複製。
{
//針對obj的操作實際上是針對複製後的臨時拷貝進行的
}
3 還有一種情況,也是與臨時對象有關的
{
CTest theTest;
return theTest
}
{
CExample theObjone;
theObjone.Init(40);
CExample theObjthree;
theObjthree.Init(60);
theObjthree=theObjone;
return 0;
}
也用到了"="號,但與"一、"中的例子並不同,"一、"的例子中,"="在對象聲明語句中,表示初始化。更多時候,這種初始化也可用括號表示。
{
...
CExample(const CExample&); //拷貝構造函數
CExample& operator = (const CExample&); //賦值符重載
...
};
//賦值操作符重載
CExample & CExample::operator = (const CExample& RightSides)
{
nSize=RightSides.nSize; //複製常規成員
char *temp=new char[nSize]; //複製指針指向的內容
memcpy(temp,RightSides.pBuffer,nSize*sizeof(char));
pBuffer=temp; //建立新指向
return *this
}
{
pBuffer=NULL;
*this=RightSides //調用重載後的"="
}
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/sinhua_ren/archive/2007/07/24/1704884.aspx