Мы используем файлы cookie
Мы используем файлы cookie для улучшения работы сайта и предоставления вам персонализированного опыта. Правила использования файлов cookie можно найти в нашей политике конфиденциальности
Правило пяти (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
Правило пяти (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
Зарегистрируйтесь или войдите, чтобы получить доступ к полным ответам на все вопросы из банка вопросов.