公牛队
移动赋值运算符

  C++语言中,移动赋值运算符(move assignment operator)用于把一个临时对象转移给一个已存在对象并可以运算符重载。类似于复制赋值运算符,移动赋值运算符也是特殊成员函数。这是从C++11开始引入的概念。

  在没有定义拷贝构造函数、拷贝赋值运算符、析构函数和移动构造函数时,编译器会自动生成移动赋值运算符。在实践中,这个特性非常有用 —— 有些资源只应该被移动而不应该被拷贝,如mutex、socket等

  移动赋值运算符的操作数是右值引用类型的(T&&),其中T是定义了移动赋值运算符的对象本身。

  移动赋值运算符不同于移动构造函数。前者是赋值给一个已存在的对象。后者是创建一个新对象。二者完成后,操作数对象不复存在。

  重载移动赋值运算符时,运算符函数的类型必须为:

  T& operator=(T&& data)

  一般应满足:

  检查不会把对象“移动”给自身,这么做无意义。

  当前对象的数据要先释放掉。

  被移动掉数据的对象必须用nullptr赋给其数据。

  运算符必须返回"*this"的引用。

  下例为一个简单字符串移动赋值运算符的重载:

  class String {

  public:

  String& operator=(String&& other) noexcept {

  // If we're not trying to move the object into itself...

  if (this != &other) {

  delete[] this->data_; // Free this string's original data.

  this->data_ = other.data_; // Copy the other string's data pointer into this string.

  other.data_ = nullptr; // Finally, reset the other string's data pointer.

  }

  return *this;

  }

  private:

  char* data_;

  };

点击分享到

热门推荐