01.赋值运算符函数*
题目描述*
如下为类型 CMyString 的声明,请为该类型添加赋值运算符函数。
class CMyString {
public:
CMyString(char *pData = nullptr);
CMyString(const CMyString* str);
~CMyString(void);
private:
char* m_pData;
}
问题分析*
- 返回类型应为类型的引用,并在函数结束前返回实例自身的引用 *this,以实现连续赋值。
- 传入参数类型应为类型的常量引用。
- 分配新内存之前要释放实例已有内存。
- 判断传入参数与当前实例是不是同一个实例,是则直接返回。如果不做判断则在释放自身时传入参数的内存也被释放。
const 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];
strcpy(m_pData, str.m_pData);
return *this;
}
以上的代码初步实现了赋值运算符的功能,但是还需要考虑 new 申请空间失败的结果,即传入 strcpy 函数的 m_pData 是空指针。这种情况出现,赋值失败且原实例被释放,显然不符合预期。为解决这一问题,我们可以选择在释放前先申请空间,如果申请失败则不再修改原实例。另一种方法是先创建一个临时实例,再交换临时实例和原实例。
const CMyString& CMyString::operator=(const CMyString &str) {
if(this != &str) {
CMyString tmp(str);
char *pTmp = tmp.m_pData;
tmp.m_pData = m_pData;
m_pData = pTmp;
}
return *this;
}
最后更新: July 23, 2022