Правило трех (программирование на C ++) - Rule of three (C++ programming)

В правило трех и правило пяти находятся эмпирические правила в C ++ для строительства безопасный код и для формализации правил по Управление ресурсами. Правила предписывают, как члены по умолчанию учебный класс следует использовать для систематического достижения этих целей.

Правило трех

В правило трех (также известный как Закон Большой тройки или Большой тройки) практическое правило в C ++ (до C ++ 11 ), который утверждает, что если учебный класс определяет любое из следующего, тогда он, вероятно, должен явно определить все три:[1]

Эти три функции специальные функции-члены. Если одна из этих функций используется без предварительного объявления программистом, она будет неявно реализована компилятором со следующей семантикой по умолчанию:

  • Деструктор - Вызвать деструкторы всех членов типа класса объекта
  • Конструктор копирования - Построить все члены объекта из соответствующих членов аргумента конструктора копирования, вызывая конструкторы копирования членов типа класса объекта и выполняя простое присваивание всех типов, не являющихся классами (например, int или указатель) элементы данных
  • Оператор присваивания копий - Назначьте все члены объекта из соответствующих членов аргумента оператора присваивания, вызывая операторы присваивания копии членов типа класса объекта и выполняя простое присваивание всех типов, не являющихся классами (например, int или указатель) элементы данных.

Правило трех утверждает, что если один из них должен был быть определен программистом, это означает, что версия, созданная компилятором, не соответствует потребностям класса в одном случае, и, вероятно, она не подойдет и в других случаях. Термин «Правило трех» был придуман Маршаллом Клайном в 1991 году.[2]

Поправка к этому правилу заключается в том, что если класс спроектирован таким образом, что Приобретение ресурсов - это инициализация (RAII) используется для всех его (нетривиальных) членов, деструктор можно оставить неопределенным (также известный как Закон Большой Двойки).[3]). Готовый пример такого подхода - использование умные указатели вместо простых.[3]

Поскольку неявно сгенерированные конструкторы и операторы присваивания просто копируют все члены данных класса ("мелкая копия "),[4] следует определить явные конструкторы копирования и копировать операторы присваивания для классов, которые инкапсулируют сложные структуры данных или имеют внешние ссылки, такие как указатели, если вам нужно скопировать объекты, на которые указывают члены класса. Если поведение по умолчанию («неглубокая копия») на самом деле является предполагаемым, то явное определение, хотя и избыточное, будет выглядеть следующим образом: «самодокументирующийся код "указывает на то, что это было намерение, а не оплошность. Современный C ++ включает синтаксис для явного указания, что функция по умолчанию желательна, без необходимости печатать тело функции.

Правило пяти

С появлением C ++ 11 правило трех может быть расширено до правило пяти (также известное как правило большой пятерки[5]) в качестве C ++ 11 орудия семантика перемещения,[6] позволяя объектам назначения схватить (или же воровать) данные из временных объектов. В следующем примере также показаны новые перемещаемые элементы: конструктор перемещения и оператор присваивания перемещения. Следовательно, для правило пяти у нас есть следующие специальные члены:

Существуют ситуации, когда классам могут потребоваться деструкторы, но они не могут разумно реализовать конструкторы копирования и перемещения и операторы присваивания копирования и перемещения. Это происходит, например, когда базовый класс не поддерживает эти последние Большой четверки члены, но конструктор производного класса выделяет память для собственного использования.[нужна цитата ] В C ++ 11 это можно упростить, явно указав пять членов по умолчанию.[7]

Смотрите также

Рекомендации

  1. ^ Страуструп, Бьярне (2000). Язык программирования C ++ (3-е изд.). Эддисон-Уэсли. стр.283 –4. ISBN  978-0-201-70073-2.
  2. ^ Кениг, Эндрю; Барбара Э. Му (2001-06-01). «С ++ стал проще: правило трех». Журнал доктора Добба. Получено 2009-09-08.
  3. ^ а б Карлссон, Бьорн; Уилсон, Мэтью (2004-10-01). "Закон большой двойки". Исходный код C ++. Артима. Получено 2008-01-22.
  4. ^ Язык программирования C ++. п. 271.
  5. ^ «C ++ 11: правило большой пятерки» (PDF). Получено 4 июн 2018.
  6. ^ Страуструп, Бьярне (2013-04-07). «C ++ 11 - новый стандарт ISO C ++». Получено 2013-05-10.
  7. ^ «Правило трех / пяти / нуля». cppreference.com. Получено 15 февраля 2015.