Объекты · Классы и память

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

Свои типы, которые ведут себя как встроенные

~25 мин 6 шагов

После урока ты сможешь

  • Перегружать арифметику и сравнение для своих типов
  • Получать все сравнения сразу через <=>
  • Выводить свой тип через std::format

Шаг 1 из 6

Свои типы, которые ведут себя как встроенные

std::string можно складывать через + и сравнивать через ==. Это не магия компилятора: в стандартной библиотеке для строк перегружены операторы. То же можно сделать для своих типов, и код станет читаться как математика:

main.cpp
#include <print>
​
struct Vec2 {
    double x = 0;
    double y = 0;
};
​
Vec2 operator+(Vec2 a, Vec2 b) {
    return {a.x + b.x, a.y + b.y};
}
​
Vec2 operator*(Vec2 v, double k) {
    return {v.x * k, v.y * k};
}
​
int main() {
    const Vec2 position{1, 2};
    const Vec2 velocity{0.5, -1};
    const Vec2 next = position + velocity * 2;
    std::println("({}, {})", next.x, next.y);
}

Оператор — это функция с особым именем: operator+, operator*, operator==. Выражение a + b компилятор превращает в вызов operator+(a, b).