C ++ определяет для вас конструктор копирования, оператор присваивания и конструктор перемещения, если это можно сделать тривиально;в этих случаях вам ничего не нужно делать, просто верните экземпляр объекта, и вызывающая сторона получит его.
Если у объекта есть некоторые части, которые не могут быть скопированы (например, ссылки), вам необходимо предоставить копиюконструкторы и присваивания самостоятельно (но может быть, класс действительно не должен копироваться или назначаться).
Существуют и другие ограничения, которые препятствуют автоматическому синтезу конструктора перемещения (чтобы избежать ошибок).
Обратите также внимание, что в некоторых случаях компилятор C ++ синтезирует конструктор копирования и присваивание, но с использованием неправильного кода.Вы должны быть осторожны (например, если класс содержит голые указатели-владельцы).
Для простого случая, когда все работает из коробки без необходимости что-либо делать, подумайте:
// A bi-dimensional point
struct P2d {
double x, y;
};
// Computes the middle point given two points
P2d average(P2d a, P2d b) {
return P2d{(a.x+b.x)/2, (a.y+b.y)/2};
}
Как видите, в классе ничего не нужно для поддержки возврата P2d
значений или принятия P2d
параметров.
Компилятор в этом случае автоматически завершает код определения до чего-то вроде:
struct P2d {
double x, y;
P2d(const P2d& other)
: x(other.x), y(other.y)
{
}
P2d& operator=(const P2d& other) {
x = other.x;
y = other.y;
return *this;
}
~P2d() {
}
};