100-55

//55.(语法)
//题目:类CMyString的声明如下:
//class CMyString
//{
//public:
// CMyString(char* pData = NULL);
// CMyString(const CMyString& str);
// ~CMyString(void);
// CMyString& operator = (const CMyString& str);
//private:
// char* m_pData;
//};

//请实现其赋值运算符的重载函数,要求异常安全,即当对一个对象进行赋值时发生异常,对象的状态不能改变。

思路:

这道题目,我有印象在effective c++中看到过。于是找了一下,就是第11条建议:在operator=中处理“自我赋值”。里面谈到了,重载赋值语句时要注意的问题,包括自我赋值安全和异常安全。一般情况下,实现时一旦注意了异常安全就会具有自我赋值安全。

贴上代码:

CMyString& CMyString::operator =(const CMyString &str) 
{ 

      if(this != &str) 
      { 

            CMyString strTemp(str); 

            char* pTemp = strTemp.m_pData; 

            strTemp.m_pData = m_pData; 
            m_pData = pTemp; 

      } 
      return *this; 

}
其中心思想就是在没有确定已经成功分配晚内存之前,就不要释放之前的内存。当然,也可以采用先生成一个temp内存,然后进行交换的思想来做。

你可能感兴趣的:(100-55)