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

Перегрузка операторов в C++ позволяет применять +, ==, << и другие к своим типам.

Перегрузка оператора — это определение поведения оператора (например +) для пользовательского типа. Записывается как функция с именем operator<символ>.

Оператор + для своего типа

Определим сложение двух векторов как метод operator+.

#include <iostream>
using namespace std;

struct Vec2 {
    int x, y;
    Vec2 operator+(const Vec2& o) const {
        return Vec2{x + o.x, y + o.y};
    }
};

int main() {
    Vec2 a{1, 2}, b{3, 4};
    Vec2 c = a + b;             // вызовется operator+
    cout << c.x << ", " << c.y << "\n";
    return 0;
}

Вывод:

4, 6

Оператор вывода <<

Перегрузка operator<< позволяет печатать объект через cout. Её делают свободной функцией, принимающей поток по ссылке.

#include <iostream>
using namespace std;

struct Vec2 { int x, y; };

ostream& operator<<(ostream& os, const Vec2& v) {
    os << "(" << v.x << ", " << v.y << ")";
    return os;                 // возвращаем поток для цепочки <<
}

int main() {
    Vec2 v{5, 7};
    cout << v << "\n";
    return 0;
}

Вывод:

(5, 7)

Коротко

  • Оператор перегружают функцией operator<символ>.
  • operator+ удобно делать методом класса.
  • operator<< делают свободной функцией и возвращают поток, чтобы работали цепочки <<.
Проверьте себя
1. Как называется функция, перегружающая оператор +?
Aplus()
Boperator+
Cadd()
Dsum+
2. Почему operator<< возвращает ссылку на поток?
AТак быстрее
BЧтобы работали цепочки cout << a << b
CЭто требование компилятора для struct
DЧтобы закрыть поток
3. Что выведет программа с operator<< для Vec2{5,7}?
A5 7
B(5, 7)
CVec2
D5,7
Поддержать проект