class CMyString
{
public:
CMyString(char *pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
//private:
char* m_pData;
} ;
CMyString::CMyString(char *pData)
{
if(pData == NULL)
{
m_pData = new char[1];
m_pData[0] = '\0';
}
else
{
m_pData = new char[strlen(pData)+1];
strcpy(m_pData,pData);
}
}
CMyString::CMyString(const CMyString& mstr)
{
this -> m_pData = new char[strlen(mstr.m_pData) + 1];
strcpy(m_pData,mstr.m_pData);
}
CMyString::~CMyString(void)
{
delete []m_pData;
}
/*
//初級版本
CMyString& CMyString::operator = (const CMyString& str)
{
if(this == &str)
{
return *this;
}
delete []m_pData; //釋放掉原有內存
m_pData = NULL;
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData,str.m_pData);
return (*this);
}
*/
//無敵改進版
CMyString& CMyString::operator = (const CMyString& mstr)
{
if(this == &mstr)
{
return *this;
}
CMyString tempString(mstr);
char *temp = tempString.m_pData;
tempString.m_pData = this -> m_pData;
this -> m_pData = temp;
return *this;
}
測試程序:
int main()
{
char *str = "hello";
CMyString s1(str);
CMyString s2;
s2 = s1;
cout << s2.m_pData << endl;
}
運行結果:
另外需要注意的是,剛剛在使用構造函數的缺省參數時,是這樣定義的:
<span style="font-size:18px;">class CMyString
{
public:
CMyString(char *pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
//private:
char* m_pData;
} ;</span>
然後在定義構造函數時,按照如下定義方式:
<span style="font-size:18px;">CMyString::CMyString(char *pData = NULL)
{
if(pData == NULL)
{
m_pData = new char[1];
m_pData[0] = '\0';
}
else
{
m_pData = new char[strlen(pData)+1];
strcpy(m_pData,pData);
}
}</span>
結果程序報錯了!
在網上查找資料後,發現:
既可以在類的聲明中,或者也可以在函數定義中聲明缺省參數。但是,不能既在類聲明中又在函數定義中同時聲明缺省參數。如果兩者都聲明的話,就像我上面一樣,編譯器是無法正確編譯的。