Мне немного сложно понять механизм c управления указателями.
Я пытаюсь сократить операции копирования с членами класса с помощью этого приложения:
#include <iostream>
#include <vector>
class Shape {
public:
std::unique_ptr<int> x;
Shape(const Shape& val) = delete; // will be delete by default by compiler?
Shape& operator=(const Shape& val) = delete; // will be delete by default by compiler?
Shape(Shape&& val) noexcept {
this->x = std::move(val.x);
}
Shape& operator=(Shape&& val) noexcept {
std::cout << "Move operator=" << std::endl;
this->x = std::move(val.x);
return *this;
}
Shape() : x(std::unique_ptr<int>(new int)) {
std::cout << "Constructor Shape" << std::endl;
}
Shape(int v) : x(std::unique_ptr<int>(new int(v))) {
std::cout << "Constructor Shape (by value)" << std::endl;
}
virtual ~Shape() {
std::cout << "Destructor Shape" << std::endl;
};
Shape operator+(const Shape& val) {
std::cout << "Move sum" << std::endl;
Shape res(*x + *val.x);
return res;
}
};
int main()
{
Shape a(1);
Shape b(3);
Shape res = a + b;
std::cout << "Value a is (" << *(a.x) << ")" << std::endl;
std::cout << "Value b is (" << *(b.x) << ")" << std::endl;
std::cout << "Value res is (" << *(res.x) << ")" << std::endl;
};
результат:
Форма конструктора (по значению) Форма конструктора (по значению) Сумма перемещений Форма конструктора (по значению) Форма деструктора Значение a is (1) Значение b is (3) Значение res is (4) Деструктор Shape Destructor Shape Destructor Shape
Хорошая идея пометить конструктор копирования и оператор копирования = как "удаленные", или я могу удалить эти строки? Насколько дорог сам оператор std :: move?