РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
687 of 815 menu

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

Конструктор перемещения - это специальный конструктор класса, который вызывается при создании нового объекта на основе временного объекта или объекта, помеченного std::move. В первый параметр конструктор принимает rvalue-ссылку на объект того же типа, из которого следует переместить ресурсы. В отличие от конструктора копирования, конструктор перемещения не копирует данные, а забирает владение ресурсами у исходного объекта, оставляя его в допустимом, но неопределённом состоянии.

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

Синтаксис

ClassName(ClassName&& other);

Пример

Давайте создадим класс, владеющий динамическим массивом, и реализуем для него конструктор перемещения:

#include <iostream> using namespace std; class Array { private: int* data; int size; public: Array(int s) : size(s) { data = new int[size]; for (int i = 0; i < size; i++) { data[i] = i + 1; } } Array(const Array& other) : size(other.size) { data = new int[size]; for (int i = 0; i < size; i++) { data[i] = other.data[i]; } } Array(Array&& other) noexcept : data(other.data), size(other.size) { other.data = nullptr; other.size = 0; } ~Array() { delete[] data; } void print() { for (int i = 0; i < size; i++) { cout << data[i] << " "; } cout << endl; } }; int main() { Array arr1(5); Array arr2 = std::move(arr1); arr2.print(); return 0; }

Результат выполнения кода:

1 2 3 4 5

Пример

Давайте убедимся, что конструктор перемещения действительно вызывается вместо конструктора копирования при передаче временного объекта:

#include <iostream> using namespace std; class Test { public: Test() { cout << "Default constructor" << endl; } Test(const Test& other) { cout << "Copy constructor" << endl; } Test(Test&& other) noexcept { cout << "Move constructor" << endl; } }; Test createTest() { Test t; return t; } int main() { Test res = createTest(); return 0; }

Результат выполнения кода:

"Default constructor" "Move constructor"

Смотрите также

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