Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpOpMvMV 123 of 150 menu
◀ ▶

Конструктор перемещения в C++

Новый объект забирает уже готовый ресурс у временного и не копирует массив. Такой конструктор называют конструктором перемещения. Он принимает ссылку на rvalue с типом Box&&.

Внутри он не выделяет новый массив, а переносит адрес из other.ptr в this->ptr.

Сразу после кражи указателя поле other.ptr ставят в nullptr. Тогда деструктор источника не вызовет delete[] для уже переданного буфера, и двойного удаления не будет.

Запишем конструктор Box(Box&& other) noexcept:

#include <iostream> class Box { public: int* ptr; Box() { ptr = new int[1]; ptr[0] = 3; } Box(Box&& other) noexcept { ptr = other.ptr; other.ptr = nullptr; std::cout << "move ctor\n"; } ~Box() { delete[] ptr; } };

Сейчас создадим объект и переместим его во второй:

int main() { Box first; int* saved = first.ptr; Box second = std::move(first); std::cout << (second.ptr == saved) << "\n"; std::cout << (first.ptr == nullptr) << "\n"; return 0; }

Добавьте конструктор перемещения в класс Cell с одним int в new[]. Постройте второй объект из первого через функцию move и выведите 1, если адрес буфера сохранился, а у источника указатель нулевой.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить