题目:如下为类型CMyString的声明,为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char* pData = nullptr);
CMyString(const CMyString& str);
~CMyString(void);
private:
char* m_pData;
};
考点:
1、返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(*this)。
2、传入的参数的类型声明为常亮引用。
3、释放实例自身已有的内存。
4、判断传入的参数和当前的实例(*this)是不是同一个实例。
解法1:
CMyString& CMyString::operator=(const CMyString &str)
{
if(this == &str)
return *this;
delete[] m_pData;
m_pData = nullptr;
m_pData = new char[strlen(str.m_pData) + 1];
strcopy(m_pData, str.m_pData);
return *this;
}
解析:在分配内存之前先用delete释放了实例m_pData的内存。如果此时内存不足导致new char 抛出异常,则m_pData将是一个空指针,容易导致程序崩溃。
解法2:
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;
}