Перегрузка операторов
Что такое перегрузка
Перегрузка позволяет объектам пользовательского типа участвовать в выражениях с привычными операторами. Например, можно определить сложение двух векторов:
struct Vec2 { float x{}; float y{}; Vec2 operator+(const Vec2& other) const { return {x + other.x, y + other.y}; }};Теперь Vec2 c = a + b; вызывает соответствующий оператор.
Член класса или свободная функция
Оператор может быть методом класса или свободной функцией. Свободная функция удобна, когда левый операнд не является объектом твоего типа либо когда операция симметрична.
struct Money { int cents{};};bool operator==(const Money& a, const Money& b) { return a.cents == b.cents;}Правила хорошего интерфейса
- Сохраняй ожидаемый смысл оператора.
- Не перегружай оператор ради необычного побочного эффекта.
- Для сравнения обеспечивай последовательное поведение.
- Не перегружай
&&и||, если рассчитываешь на обычное короткое замыкание: перегруженные версии не ведут себя как встроенные логические операторы.
Операторы присваивания
Оператор = имеет особые требования, связанные с копированием и перемещением. Для классов, состоящих из стандартных RAII-членов, обычно лучше использовать автоматически сгенерированные операции, а не писать их вручную.
Итог
Перегрузка операторов делает пользовательские типы естественными в использовании, если поведение очевидно. Если выражение становится менее понятным, лучше предоставить именованный метод.
