Правило пяти (rule of five) требует явного определения пяти специальных функций-членов, если требуется контролировать копирование, перемещение или разрушение объекта:
~Class()): Освобождает ресурсы.Class(const Class& other)): Создает новый объект как копию существующего.Class& operator=(const Class& other)): Присваивает содержимое одного объекта другому.Class(Class&& other)): Создает новый объект, "крадя" ресурсы у существующего временного объекта.Class& operator=(Class&& other)): Перемещает ресурсы из существующего временного объекта в текущий.Если хотя бы одна из этих функций определена явно, компилятор перестает автоматически генерировать остальные (или генерирует их в зависимости от правил C++11/14/17). Это правило пришло на смену правилу трех (деструктор, конструктор копирования, оператор присваивания копированием) с появлением семантики перемещения в C++11.
Правило нуля (rule of zero) гласит: если класс не управляет каким-либо ресурсом, то все пять (или три) специальные функции не должны быть определены явно. Вместо этого, следует полагаться на сгенерированные компилятором версии или использовать RAII-объекты (Resource Acquisition Is Initialization), такие как std::vector, std::string, std::unique_ptr, которые сами управляют ресурсами. Класс, использующий такие объекты, автоматически получает корректные сгенерированные специальные функции. Это предпочтительный подход в современном C++, так как снижает вероятность ошибок при управлении ресурсами и упрощает код.
Пример, иллюстрирующий правило пяти (неправильное управление ресурсом):
cpp
Пример, иллюстрирующий правило нуля (использование RAII):
cpp