Jump to content

Переместить оператор присваивания

В языке программирования C++ оператор перемещения перемещения = используется для переноса временного объекта в существующий объект. Оператор присваивания перемещения, как и большинство операторов C++, может быть перегружен . Как и оператор присваивания копирования, это специальная функция-член .

Если оператор перемещения перемещения не определен явно, компилятор генерирует неявный оператор перемещения перемещения ( C++11 и новее) при условии, что конструкторы копирования / перемещения , оператор копирования копирования или деструкторы не были объявлены. [1] Параметр оператора присваивания перемещения — это ссылка rvalue (T&&) на тип T , где T — объект, определяющий оператор присваивания перемещения. Оператор присваивания перемещения отличается от конструктора перемещения, поскольку оператор присваивания перемещения вызывается для существующего объекта, а конструктор перемещения вызывается для объекта, созданного в результате операции. После этого данные другого объекта перестают быть действительными.

Перегрузка оператора присваивания перемещения

[ редактировать ]

Чтобы перегрузить оператор присваивания перемещения, сигнатура функции должна быть: [1]

T& operator=(T&& data)

Чтобы успешно перегрузить оператор присваивания перемещения, должны быть выполнены следующие условия:

  • Проверьте, не вызывает ли объект, вызывающий оператор, самого себя.
  • Данные текущего объекта освобождаются.
  • Данные объекта, из которого выполняется перемещение, должны быть помечены как nullptr (или что-то еще, обозначающее перемещение).
  • Оператор должен вернуть ссылку на «*this».

Рассмотрим следующий оператор присваивания перемещения для простого строкового класса: [2]

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_;
};
  1. ^ Jump up to: а б «Переместить оператор присваивания — cppreference.com» . ru.cppreference.com . Проверено 23 февраля 2016 г.
  2. ^ «Конструкторы перемещения и операторы присваивания перемещения (C++)» . msdn.microsoft.com . Проверено 23 февраля 2016 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 44838d9838d915a53f041df96b70fd2e__1669149540
URL1:https://arc.ask3.ru/arc/aa/44/2e/44838d9838d915a53f041df96b70fd2e.html
Заголовок, (Title) документа по адресу, URL1:
Move assignment operator - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)