Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpOpMvRF 125 of 150 menu
◀ ▶

Правило пяти в 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[]. Скопируйте объект, затем присвойте другой объект перемещением и выведите значение из копии.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить