自定義類的賦值運算符重載函數的作用與內置賦值運算符的作用類似,但是要要注意的是,它與拷貝構造函數與析構函數一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定默認的賦值運算符重載函數,那麼系統將會自動提供一個賦值運算符重載函數。
賦值運算符重載函數的定義與其它運算符重載函數的定義是差不多的。
下面我們以實例說明如何使用它,代碼如下:
//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者
#include <iostream>
using namespace std;
class Internet
{
public:
Internet(char *name,char *url)
{
Internet::name = new char[strlen(name)+1];
Internet::url = new char[strlen(url)+1];
if(name)
{
strcpy(Internet::name,name);
}
if(url)
{
strcpy(Internet::url,url);
}
}
Internet(Internet &temp)
{
Internet::name=new char[strlen(temp.name)+1];
Internet::url=new char[strlen(temp.url)+1];
if(name)
{
strcpy(Internet::name,temp.name);
}
if(url)
{
strcpy(Internet::url,temp.url);
}
}
~Internet()
{
delete[] name;
delete[] url;
}
Internet& operator =(Internet &temp)//賦值運算符重載函數
{
delete[] this->name;
delete[] this->url;
this->name = new char[strlen(temp.name)+1];
this->url = new char[strlen(temp.url)+1];
if(this->name)
{
strcpy(this->name,temp.name);
}
if(this->url)
{
strcpy(this->url,temp.url);
}
return *this;
}
public:
char *name;
char *url;
};
int main()
{
Internet a("中國軟件開發實驗室","www.cndev-lab.com");
Internet b = a;//b對象還不存在,所以調用拷貝構造函數,進行構造處理。
cout<<b.name<<endl<<b.url<<endl;
Internet c("美國在線","www.aol.com");
b = c;//b對象已經存在,所以系統選擇賦值運算符重載函數處理。
cout<<b.name<<endl<<b.url<<endl;
system("pause");
}
上例代碼中的Internet& operator =(Internet &temp)就是賦值運算符重載函數的定義,內部需要先delete的指針就是涉及深拷貝問題的地方,由於b對象已經構造過,name和url指針的范圍已經確定,所以在復制新內容進去之前必須把堆區清除,區域的過大和過小都不好,所以跟在後面重新分配堆區大小,而後進行復制工作。
在類對象還未存在的情況下,賦值過程是通過拷貝構造函數進行構造處理(代碼中的Internet b = a;就是這種情況),但當對象已經存在,那麼賦值過程就是通過賦值運算符重載函數處理(例子中的b = c;就屬於此種情況)。