跳转至

01.赋值运算符函数*

题目描述*

如下为类型 CMyString 的声明,请为该类型添加赋值运算符函数。

class CMyString {
public:
    CMyString(char *pData = nullptr);
    CMyString(const CMyString* str);
    ~CMyString(void);
private:
    char* m_pData;
}

问题分析*

  1. 返回类型应为类型的引用,并在函数结束前返回实例自身的引用 *this,以实现连续赋值。
  2. 传入参数类型应为类型的常量引用。
  3. 分配新内存之前要释放实例已有内存。
  4. 判断传入参数与当前实例是不是同一个实例,是则直接返回。如果不做判断则在释放自身时传入参数的内存也被释放。
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