C++ 实现复制赋值运算符重载

考察点

  • 返回值类型 MyClass&,可以连续赋值
  • 参数类型:(const MyClass& rhs) 或者 (MyClass rhs) 值传递(copy-swap)
  • 自赋值安全
  • 无内存泄漏,旧值需要析构
  • 异常安全

参考实现

copy-swap 惯用法

BennyHuo

class MyString1 {
 public:
  friend void swap(MyString1& lhs, MyString1& rhs) noexcept {
    using std::swap; // ADL: Argument-dependent lookup
    swap(lhs.pData, rhs.pData);
  }

  MyString1& operator=(MyString1 rhs) {
    // 参数 rhs 已经复制,无需再次创建副本
    using std::swap;
    swap(*this, rhs);
    return *this;
  }

 private:
  char* pData = nullptr;
};

剑指 Offer

class MyString2 {
 public:
  MyString2& operator=(const MyString2& rhs) {
    //  参数类型是 const 引用,需要创建 rhs 副本
    MyString2 tmp(rhs);

    auto pTmp = tmp.pData;
    tmp.pData = pData;
    pData = pTmp;

    return *this;
  }

 private:
  char* pData = nullptr;
};

相关推荐

posted @ 2023-01-25 10:49  Zijian/TENG  阅读(70)  评论(0编辑  收藏  举报