Перегрузка операторов в 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