*Задача*: Создание копии объекта, переданного в качестве аргумента, при этом можно использовать части этого объекта.
*Назначение*: Используется компилятором для оптимизации вычислений.
*Замечания*:
* Компилятор создает сам создает перемещающий конструктор, только если в классе **не определяются** явно деструктор, конструктор копий или операции обычного и перемещающего присваивания. В этом автоматически созданном конструкторе вызываются перемещающие конструкторы для всех базовых классов и полей.
* Если вы использовали динамическое выделение памяти и определили деструктор, то компилятор не будет оптимизировать операции с временными объектами, пока вы не определите явно перемещающий конструктор и перемещающую операцию присваивания.
* Для явного перемещения полей стандартный классов (vector, string и т.д.) и объектов с перемещающим конструктором используется функция STL ``std::move``.
```C++
class A {
int size;
string s;
double *data;
public:
A(int);
A(const A&); // конструктор копий
A(A&&); // перемещающий конструктор
A& operator=(const A&); // обычная операция присваивания
A& operator=(A&&); // перемещающая операция присваивания
~A();
};
A::A(const A& a):size(a.size),s(a.s),data(new double[size])
{ std::copy(a.data,a.data+size,data);
}
A::A(A&& a):size(a.size),s(std::move(a.s)),data(a.data)
{ a.data=nullptr;
}
A& A::operator=(const A& a)
{ A t(a);
std::swap(size,t.size);
s.swap(t.s);
std::swap(data,t.data);
return *this;
}
A& A::operator=(A&& a)
{ std::swap(size,a.size);
s=std::move(a.s);
std::swap(data,a.data);
return *this;
}
A::~A() { delete []data; }
...
A f() { A a(100); ... return a; }
...
A x;
x=f();
```
При отсутствии перемещающих конструктора и присваивания массив data локально созданного в функции f объекта будет дважды скопирован из одной области памяти в другую (a `->` временный объект `->` x), а при их наличии -- это не потребуется делать ни разу.