#20. Конструктор перемещения. Оператор присваивания перемещением | Уроки ООП C++

  Рет қаралды 1,114

selfedu

selfedu

Ай бұрын

Практический курс по C/C++: stepik.org/course/193691/
Телеграм-канал: t.me/java_and_c
Инфо-сайт: proproprogs.ru/cpp_oop
Зачем нужен и как работает конструктор перемещения. Пример реализации и использования операции присваивания перемещением.

Пікірлер: 9
@andredru4278
@andredru4278 4 күн бұрын
Спасибо. Качаем скилы!
@szapsis
@szapsis Ай бұрын
Спасибо большое за твой труд друг!
@jiper100
@jiper100 Ай бұрын
💯
@Prikol8877
@Prikol8877 Ай бұрын
Top video
@user-bn5cf7uw3x
@user-bn5cf7uw3x Ай бұрын
А можно ли освободить память у this->_data, а потом "this=&right;" и "right._data=nullptr;" в операторе присваивания перемещением?
@user-bn5cf7uw3x
@user-bn5cf7uw3x Ай бұрын
В этом случае же, вроде, копируется адрес right и оператор присваивания копированием вызваться не должен?
@billjohnes9380
@billjohnes9380 Ай бұрын
Указателю this нельзя ничего присвоить, его нельзя изменить, он -- константный. Здесь можно выполнить обмен полями данных length, capacity и data между right и объектом, для которого вызван перемещающий оператор присваивания. Тогда, когда закончится вычисление выражения, в контексте которого был вызван перемещающий оператор присваивания, right будет уничтожен. При уничтожении right в его деструкторе освободится та память, которая была в поле data объекта, для которого был вызван перемещающий оператор присваивания и которая сейчас освобождается прямо в этом самом перемещающем операторе присваивания.
@donlinoleum831
@donlinoleum831 Ай бұрын
Что ж, тяжеловато... Как я понял, смысл в том, что rvalue ссылки могут ссылаться на объекты, которые нельзя напрямую куда то сохранить. А для создания временных объектов это то, что нужно.
@billjohnes9380
@billjohnes9380 Ай бұрын
Нет, смысл в том, что rvalue-ссылки могут ссылаться только на rvalue. Конструкторы копирования/перемещения перегружены, должен выбраться один из них. Если при конструировании в качестве инициализирующего значения используется rvalue, будет выбираться конструктор перемещения, иначе -- конструктор копии. То же самое и для оператора присваивания: они перегружены, и если справа от = используется rvalue, то выберется перемещающий оператор, иначе -- копирующий. Поскольку rvalue вскоре будет уничтожен, его значение можно "портить", но так, чтобы потом его деструктор мог отработать без замечаний. Поэтому можно "свистнуть" себе у rvalue память, адрес которой хранится в его поле data, а в его поле data подсунуть nullptr, чтобы его деструктор отработал правильно. Таким образом, наш объект "завладевает" памятью, которой владел объект rvalue без выделения аналогичного блока памяти, копирования и освобождения исходного. В этом суть выигрыша от "перемещения": скопировать значение указателя и занулить исходный -- значительно быстрее выделения новой памяти и копирования данных.
Введение в ИТ. Rvalue-ссылки и семантика перемещения
20:59
Робототехника и комплексная автоматизация
Рет қаралды 5 М.
I PEELED OFF THE CARDBOARD WATERMELON!#asmr
00:56
HAYATAKU はやたく
Рет қаралды 36 МЛН
Do you have a friend like this? 🤣#shorts
00:12
dednahype
Рет қаралды 16 МЛН
Последний Закат Кота Макса...
00:21
Глеб Рандалайнен
Рет қаралды 4 МЛН
Решаем тестовое задание на позицию junior python backend разработчик
21:18
𝐧𝐞𝐫𝐝𝐢𝐳𝐚𝐲-𝐜𝐨𝐝𝐞
Рет қаралды 10 М.
Базовый курс C++ (MIPT, ILab). Lecture 5. RAII и перемещение
1:23:34
Первый Алгоритм Для Изучения в 2024
8:13
Саша Лукин
Рет қаралды 65 М.
Изучение C++ в одном видео уроке за час!
1:14:33
Гоша Дударь
Рет қаралды 807 М.
I PEELED OFF THE CARDBOARD WATERMELON!#asmr
00:56
HAYATAKU はやたく
Рет қаралды 36 МЛН