Правило пяти в C++
Правило пяти дополняет правило трех двумя операциями перемещения.
Класс, который владеет new[], обычно
объявляет деструктор, конструктор
копирования, оператор присваивания
копированием, конструктор перемещения
и оператор присваивания перемещением.
Все пять функций следят за одним указателем: копии получают свой буфер, перемещение передает адрес и обнуляет источник, деструктор освобождает буфер только у живого владельца.
Запишем компактный Box со всеми
пятью функциями:
class Box {
public:
int* ptr;
Box() {
ptr = new int[1];
ptr[0] = 2;
}
Box(const Box& other) {
ptr = new int[1];
ptr[0] = other.ptr[0];
}
Box(Box&& other) noexcept {
ptr = other.ptr;
other.ptr = nullptr;
}
Box& operator=(const Box& other) {
if (this != &other) {
delete[] ptr;
ptr = new int[1];
ptr[0] = other.ptr[0];
}
return *this;
}
Box& operator=(Box&& other) noexcept {
if (this != &other) {
delete[] ptr;
ptr = other.ptr;
other.ptr = nullptr;
}
return *this;
}
~Box() {
delete[] ptr;
}
};
Сейчас скопируем объект и переместим другой:
int main() {
Box a;
Box b = a;
Box c;
c = std::move(a);
std::cout << b.ptr[0] << "\n";
std::cout << c.ptr[0] << "\n";
std::cout << (a.ptr == nullptr) << "\n";
return 0;
}
Оформите класс Bin по правилу пяти
для одного int в new[].
Скопируйте объект, затем присвойте
другой объект перемещением и выведите
значение из копии.