#include
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;
};
innt main()
{
Internet a("中國軟體開發實驗室","www.cndev-lab.com");
Internet b = a;//b對象還不存在,所以調用拷貝建構函式,進行構造處理。
cout<< Internet c("美國線上","www.aol.com");
b = c;//b對象已經存在,所以系統選擇賦值運算子多載函數處理。
cout< system("pause");
}
上例代碼中的Internet& operator =(Internet &temp)就是賦值運算子多載函數的定義,內部需要先delete的指標就是涉及深拷貝問題的地方,由於b對象已經構造過,name和url指標的範圍已經確定,所以在複製新內容進去之前必須把堆區清除,地區的過大和過小都不好,所以跟在後面重新分配堆區大小,而後進行複製工作。