=号重载的注意事项

 

对于以下类中重载的=号,这可能是大家常采用的写法:

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;

   }

 

原文地址:https://www.cnblogs.com/jian1573/p/3266354.html