=号重载的注意事项
对于以下类中重载的=号,这可能是大家常采用的写法:
class tmp
{
private:
char* strTmp;
int m_iLength;
public:
tmp(){ strTmp = NULL; }
~tmp(){ DelStr(); }
void InitStr(char* str,int iLength)
{
if( (NULL == str)|| (0==iLength)) return;
strTmp = new char[iLength];
strcpy(strTmp,str);
m_iLength = iLength;
}
void DelStr()
{
if(NULL!=strTmp) delete[] strTmp;
strTmp = NULL;
m_iLength = 0;
}
tmp& operator =(tmp& Copy)
{
DelStr();
InitStr(Copy.strTmp,Copy.m_iLength);
return *this;
}
}
这段代码的主要问题出在=号的重载上面:
{
DelStr();
InitStr(Copy.strTmp,Copy.m_iLength);
return *this;
}
这样的错误可能大家都会犯,而且往往会不以为然,考虑下面的一段调用:
tmp xx;
char *Mystr = new char[100];
strcpy(Mystr,"abcd");
xx.InitStr(Mystr,5);
xx = xx;//这一句的结果会是什么??
显然执行完成后,xx的内容被清空了!!!
正确的写法:
tmp& operator =(tmp& Copy)
{
if(this == &Copy)
return *this;
DelStr();
InitStr(Copy.strTmp,Copy.m_iLength);
return *this;
}