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

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

selfedu

selfedu

2 ай бұрын

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

Пікірлер: 9
@andredru4278
@andredru4278 Ай бұрын
Спасибо. Качаем скилы!
@szapsis
@szapsis 2 ай бұрын
Спасибо большое за твой труд друг!
@Prikol8877
@Prikol8877 2 ай бұрын
Top video
@user-bn5cf7uw3x
@user-bn5cf7uw3x 2 ай бұрын
А можно ли освободить память у this->_data, а потом "this=&right;" и "right._data=nullptr;" в операторе присваивания перемещением?
@user-bn5cf7uw3x
@user-bn5cf7uw3x 2 ай бұрын
В этом случае же, вроде, копируется адрес right и оператор присваивания копированием вызваться не должен?
@billjohnes9380
@billjohnes9380 2 ай бұрын
Указателю this нельзя ничего присвоить, его нельзя изменить, он -- константный. Здесь можно выполнить обмен полями данных length, capacity и data между right и объектом, для которого вызван перемещающий оператор присваивания. Тогда, когда закончится вычисление выражения, в контексте которого был вызван перемещающий оператор присваивания, right будет уничтожен. При уничтожении right в его деструкторе освободится та память, которая была в поле data объекта, для которого был вызван перемещающий оператор присваивания и которая сейчас освобождается прямо в этом самом перемещающем операторе присваивания.
@jiper100
@jiper100 2 ай бұрын
💯
@donlinoleum831
@donlinoleum831 2 ай бұрын
Что ж, тяжеловато... Как я понял, смысл в том, что rvalue ссылки могут ссылаться на объекты, которые нельзя напрямую куда то сохранить. А для создания временных объектов это то, что нужно.
@billjohnes9380
@billjohnes9380 2 ай бұрын
Нет, смысл в том, что rvalue-ссылки могут ссылаться только на rvalue. Конструкторы копирования/перемещения перегружены, должен выбраться один из них. Если при конструировании в качестве инициализирующего значения используется rvalue, будет выбираться конструктор перемещения, иначе -- конструктор копии. То же самое и для оператора присваивания: они перегружены, и если справа от = используется rvalue, то выберется перемещающий оператор, иначе -- копирующий. Поскольку rvalue вскоре будет уничтожен, его значение можно "портить", но так, чтобы потом его деструктор мог отработать без замечаний. Поэтому можно "свистнуть" себе у rvalue память, адрес которой хранится в его поле data, а в его поле data подсунуть nullptr, чтобы его деструктор отработал правильно. Таким образом, наш объект "завладевает" памятью, которой владел объект rvalue без выделения аналогичного блока памяти, копирования и освобождения исходного. В этом суть выигрыша от "перемещения": скопировать значение указателя и занулить исходный -- значительно быстрее выделения новой памяти и копирования данных.
Введение в ИТ. Rvalue-ссылки и семантика перемещения
20:59
Робототехника и комплексная автоматизация
Рет қаралды 5 М.
Неприятная Встреча На Мосту - Полярная звезда #shorts
00:59
Полярная звезда - Kuzey Yıldızı
Рет қаралды 4,2 МЛН
1❤️#thankyou #shorts
00:21
あみか部
Рет қаралды 88 МЛН
Haha😂 Power💪 #trending #funny #viral #shorts
00:18
Reaction Station TV
Рет қаралды 8 МЛН
small vs big hoop #tiktok
00:12
Анастасия Тарасова
Рет қаралды 10 МЛН
Указатель на функцию в языке С++
16:54
Оксана Еськова. Основы программирования
Рет қаралды 224
How a former airborne trooper was welcomed in prison (with English subtitles)
10:40
Зона в кинематографе
Рет қаралды 11 МЛН
Как бы я начал учить кодинг сейчас?
12:15
C#. Covariance and Contravariance in generic interfaces.
6:35
ExtremeCode
Рет қаралды 80 М.
Неприятная Встреча На Мосту - Полярная звезда #shorts
00:59
Полярная звезда - Kuzey Yıldızı
Рет қаралды 4,2 МЛН