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)

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

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

challenge icon

Задание

Легко

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

Вы создадите два файла для организации вашего кода:

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

    Оператор + должен быть реализован как функция-член, которая принимает другой объект Point по константной ссылке и возвращает новый Point. Пометьте его как const, так как он не изменяет ни один из операндов.

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

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

    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);.

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

Шпаргалка

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

Чтобы перегрузить оператор, определите функцию, используя ключевое слово 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)

Некоторые операторы нельзя перегружать: ::, ., ?: и sizeof. Вы не можете создавать новые операторы или изменять приоритет операторов.

Операторы могут быть реализованы как функции-члены или функции, не являющиеся членами класса.

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

#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: Выведите результаты в требуемом формате:
    // Point 1: (<x1>, <y1>)
    // Point 2: (<x2>, <y2>)
    // Sum: (<sum_x>, <sum_y>)

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

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

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