剑指offer系列 赋值运算符。
如下类型声明,为该类型添加赋值运算符函数?
class CMyString{
private:char* m_pData;
public:
CMyString();
CMyString(char* pData);
CMyString(const CMyString& str);
CMyString& operator=(const CMyString &str);
~CMyString(void);
void show();
};
在外面定义,需要先在类的内部声明。
基础解法:
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;
}
但是在分配内存前,要是先delete了内存,在赋值运算符函数中将会出现一个空指针的异常
改善解法:
CMyString& CMyString::operator =(const CMyString &str){
if(this != &str){
CMyString strTmp(str);
char *pdata = strTmp.m_pData;
strTmp.m_pData = m_pData;
m_pData = pdata;
}
return *this;
}
采用一个临时局部实例,将实例strTmp的m_pData和自身的m_pData交换,strTmp是一个变量,出了if函数将会自动调用析构函数,由于strTmp指向的是实例之前的m_pData的内存,继而释放。