Перегрузка операторов
Научите встроенные операторы работать с вашими собственными типами
+, == или << — это на самом деле просто функция с символическим именем. Создавая класс, вы можете предоставить свою версию этой функции, чтобы a + b, a == b или cout << a вели себя осмысленно для вашего типа — точно так же, как для int и string.
- перегружать арифметические операторы и операторы сравнения (
+,==,<) для своего класса, - правильно выбирать между оператором-методом и свободным (не входящим в класс) оператором,
- перегружать
operator<<для потоков и применятьfriend, когда нужен доступ к приватным данным, - соблюдать
const-корректность и выбирать правильные типы возврата (значение или ссылка), - понимать, чего делать нельзя, и пользоваться сокращением
<=>из C++20.
1. Оператор — это замаскированная функция
Считайте компилятор переводчиком. Когда он видит a + b, у него нет заранее заданного понятия «плюс» для вашего класса. Вместо этого он ищет функцию, буквально названную operator+, которая принимает операнды этих типов. Если он её находит — вызывает; если нет — код не компилируется.
Аналогия. Символ + похож на слово «объединить». Для чисел «объединить» значит сложить. Для строк — склеить. Для корзины покупок это может означать «слить две корзины». Символ остаётся тем же, но вы решаете, что значит объединение для вашего типа — как один глагол выполняет разные задачи в разных контекстах.
Именно это делает пользовательские типы полноправными. Money, Vector2D или Matrix можно складывать, сравнивать и печатать тем же чистым синтаксисом, что и int, вместо того чтобы всюду вызывать a.add(b).
a + b into a member call or a free-function call, depending on how you declared the operator.