剑指offer的面试题,赋值运算符函数


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

        private:
            char*m_pData;

}

 

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

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

    // 添加赋值运算符函数声明
    CMyString& operator=(const CMyString& str);

private:
    char* m_pData;
};
CMyString& CMyString::operator=(const CMyString& str)
{
    // 检查自赋值
    if (this == &str)
        return *this;

    // 删除原有的数据
    delete[] m_pData;

    // 如果传入的字符串为空,则将 m_pData 设为 nullptr
    if (str.m_pData == nullptr)
    {
        m_pData = nullptr;
    }
    else
    {
        // 分配新的内存并复制数据
        size_t length = strlen(str.m_pData);
        m_pData = new char[length + 1];
        strcpy(m_pData, str.m_pData);
    }

    // 返回当前对象的引用
    return *this;
}

这个实现考虑了以下几点:

  1. 自赋值检查:防止对象赋值给自身时出现问题。
  2. 删除原有数据:释放当前对象已分配的内存,防止内存泄漏。
  3. 处理空指针情况:如果传入的对象的 m_pData 为 nullptr,则将当前对象的 m_pData 也设为 nullptr。
  4. 分配新内存并复制数据:为新的字符串分配内存,并复制数据。
  5. 返回 *this:允许连续赋值操作,如 a = b = c。

注意:这个实现假设 CMyString 的构造函数和析构函数已正确实现,特别是析构函数应该使用 delete[] 来释放 m_pData。

你可能还想考虑实现移动赋值运算符(C++11及以后版本支持),以提高效率

CMyString& operator=(CMyString&& str) noexcept
{
    if (this != &str)
    {
        delete[] m_pData;
        m_pData = str.m_pData;
        str.m_pData = nullptr;
    }
    return *this;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值