题目:如下为类型CMyString的声明,请为该类型添加赋值运算函数符。
class CMyString
{
public:
CMyString(char* pData=NULL);
CMyString(const CMyString& str);
~CMyString(void);
private:
char* m_pData;
}
此类问题主要是注意一些细节,比如返回值和传入值,像书上说的如果没有返回值,那么赋值符不能用来连等、传入的最好是引用来避免不必要的拷贝、传入参数要是const的确保原参数不被改变等等。
在不考虑内存不足的情况下给出一个可行的答案:
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;
}
如果考虑内存不足的情况,即new操作失败,那么上述过程将会在strcpy步骤发生异常。
书上采用先将原参数拷贝一份的方法来解决这个问题,这样做确实还是很不错的,免去了很容易出问题的字符复制过程,局部变量tmp_str接收了本需要手动释放的空间,在函数执行之后由系统自动释放。
CMyString & CMyString::operator =(const CMyString& str)
{
if(this!=&str)
{
CMyString tmp_str(str);
char * tmp = tmp_str.m_pData;
tmp_str.m_pData = m_pData;
m_pData = tmp;
}
return *this;
}