Конструктор перемещения
Конструктор перемещения - это специальный конструктор класса,
который вызывается при создании нового объекта на основе
временного объекта или объекта, помеченного 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"
Смотрите также
-
конструктор
копирования,
который копирует ресурсы из другого объекта -
оператор
перемещающего присваивания,
который перемещает ресурсы при присваивании -
конструктор
по умолчанию,
который создаёт объект без параметров -
деструктор
класса,
который освобождает ресурсы объекта