题目:
如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
private:
char* m_pData;
};
实现注意点:
1 参数应该为const引用,提高效率。
2 返回值应该为引用,以使用连续赋值。
3 证同判断。
4 释放原来指向的资源,防止内存泄漏。
初级方法:
CMyString& CMyString::operator=(const CMyString& other)
{
if (this == &other) return *this;
delete [] m_pData;
m_pData = new char[std::strlen(other.m_pData) + 1];
std::strcpy(m_pData, other.m_pData);
return *this;
}
高级方法: 异常安全
CMyString& CMyString::operator=(const CMyString& other)
{
if (this == &other) return *this;
CMyString temp(other);
std::swap(m_pData, temp.m_pData);
return *this;
}
高级方法改进(COPY AND SWAP):直接pass by value,不需要在函数体中调用拷贝构造函数,同时也不再需要判同。
具体可参考:copy-and-swap idiom详解和实现安全自我赋值
CMyString& CMyString::operator=(CMyString other) // 直接pass by value
{
std::swap(m_pData, other.m_pData);
return *this;
}