Перейти к содержанию

Начало урока

Перегрузка операторов

Научите встроенные операторы работать с вашими собственными типами

Главная идея: В C++ оператор вроде +, == или << — это на самом деле просто функция с символическим именем. Создавая класс, вы можете предоставить свою версию этой функции, чтобы 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 source you write member operator free operator a.operator+(b) left operand = this operator+(a, b) both operands = params Same result. The compiler chooses whichever overload you defined for these operand types.
The compiler rewrites a + b into a member call or a free-function call, depending on how you declared the operator.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя