Menu
Coddy logo textTech

Введение в перегрузку операторов

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 40 из 104.

Перегрузка операторов позволяет определить, как ведут себя такие операторы, как +, - или ==, при использовании с вашими пользовательскими классами. Вместо вызова таких методов, как a.add(b), можно написать более интуитивное выражение a + b.

В C++ операторы по сути являются функциями со специальными именами. Чтобы перегрузить оператор, вы определяете функцию, используя ключевое слово operator, за которым следует символ:

class Vector2D {
    double x, y;
    
public:
    Vector2D(double x, double y) : x(x), y(y) {}
    
    // Перегрузить оператор +
    Vector2D operator+(const Vector2D& other) const {
        return Vector2D(x + other.x, y + other.y);
    }
};

Теперь вы можете естественным образом сложить два вектора:

Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2;    // Вызывает v1.operator+(v2)

Не все операторы можно перегружать. Оператор разрешения области видимости ::, доступ к member ., тернарный оператор ?: и sizeof нельзя перегружать. Кроме того, нельзя создавать новые операторы или изменять приоритет оператора — * всегда вычисляется до +.

Операторы можно реализовать как функции-члены (как выше) или как нечленовые функции. В следующих уроках ты узнаешь, когда использовать каждый подход и как перегружать определённые категории операторов.

challenge icon

Задание

Легко

Давайте создадим класс Point, представляющий 2D-координату и поддерживающий сложение двух точек с помощью оператора +. Это ваш первый шаг к перегрузке операторов, позволяющей вашим пользовательским классам работать со знакомыми операторами.

Вы создадите два файла, чтобы организовать свой код:

  • Point.h: Определите класс Point, который хранит координаты x и y (обе имеют тип int). Ваш класс должен иметь:
    • Закрытые члены для координат x и y
    • constructor, который принимает значения x и y
    • Геттеры getX() и getY() (оба const)
    • Перегруженный оператор +, который складывает две точки и возвращает новый Point с combined координатами

    Оператор + следует реализовать как функцию member, которая принимает другую точку Point по константной reference и возвращает новый Point. Пометьте его как const, поскольку он не modify ни один из двух operand.

  • main.cpp: Считайте из input четыре целых числа (x1, y1, x2, y2 в отдельных строках), представляющих две точки. Создайте два объекта Point, сложите их с помощью оператора + и выведите results.

    Формат вывода:

    Point 1: (<x1>, <y1>)
    Point 2: (<x2>, <y2>)
    Sum: (<sum_x>, <sum_y>)

Ключевая идея здесь заключается в том, что p1 + p2 на самом деле за кулисами вызывает p1.operator+(p2). Ваш перегруженный оператор позволяет писать интуитивно понятный код, например Point p3 = p1 + p2;, вместо чего-то вроде Point p3 = p1.add(p2);.

Преобразуйте строки input в целые числа с помощью std::stoi(). Не забудьте добавить защиты от повторного включения в заголовочный файл.

Попробуйте сами

#include <iostream>
#include <string>
#include "Point.h"

using namespace std;

int main() {
    // Считать ввод
    string line1, line2, line3, line4;
    getline(cin, line1);
    getline(cin, line2);
    getline(cin, line3);
    getline(cin, line4);

    int x1 = stoi(line1);
    int y1 = stoi(line2);
    int x2 = stoi(line3);
    int y2 = stoi(line4);

    // TODO: Создать два объекта Point, используя входные значения

    // TODO: Сложить две точки с помощью оператора +

    // TODO: Вывести результаты в требуемом формате:
    // Точка 1: (<x1>, <y1>)
    // Точка 2: (<x2>, <y2>)
    // Сумма: (<sum_x>, <sum_y>)

    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C++