Правило трьох (C++)
Правило трьох («Закон великої трійки», «Велика трійка») — практичне правило в C++, яке каже, що якщо в класі визначений один з таких методів, то, найпевніше, в ньому мають бути визначені всі три[1]:
- Деструктор (англ. destructor)
- Конструктор копіювання (англ. copy constructor)
- Оператор присвоєння копіюванням (англ. copy assignment operator)
Ці три особливі функції-члени, можуть автоматично створюватися компілятором у випадку, якщо програміст не визначив їх явно (насправді, це не завжди так, наприклад, якщо один з атрибутів класу константа і, таким чином, вимагає явної ініціалізації). Якщо один з них має бути визначений програмістом, значить версія створена компілятором не підходить, а це означає, що, найпевніше, версії компілятора не підійдуть і для двох інших функцій.
Правда, у випадку якщо використовується техніка «виділення ресурсу є ініціалізація» можна покластися на версію деструктора від компілятора (іноді згадують як «Закон великої двійки»[2]).
Через те, що неявно згенеровані конструктори і оператори надання значення просто копіюють всі члени даних класу[3] визначення явних конструкторів копіювання і операторів присвоювання необхідно у випадках, коли клас інкапсулює складні структури даних або має зовнішні посилання такі як вказівники, що означає можливість копіювання лише самого вказівника, а не об'єкта на який він вказує.
Правило п'яти
В C++11 додали семантику переміщення, тому в правило додано ще два методи:
- Конструктор переміщення (англ. move constructor)
- Оператор присвоєння переміщенням (англ. move assignment operator)
Примітки
- Stroustrup, Bjarne (2000). The C++ Programming Language (вид. 3). Addison-Wesley. с. 283–4. ISBN 978-0201700732.
- Karlsson, Bjorn; Wilson, Matthew (1 жовтня 2004). The Law of the Big Two. The C++ Source. Artima. Архів оригіналу за 17 березня 2012. Процитовано 22 січня 2008.
- The C++ Programming Language. с. 271.