Menu
Coddy logo textTech

Перегрузка операторов сравнения

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

Операторы сравнения, такие как ==, !=, <, >, <= и >=, позволяют сравнивать объекты ваших пользовательских классов. Эти операторы возвращают значение bool и должны быть помечены как const, поскольку они не изменяют ни один из операндов.

class Date {
    int year, month, day;
    
public:
    Date(int y, int m, int d) : year(y), month(m), day(d) {}
    
    bool operator==(const Date& other) const {
        return year == other.year && 
               month == other.month && 
               day == other.day;
    }
    
    bool operator<(const Date& other) const {
        if (year != other.year) return year < other.year;
        if (month != other.month) return month < other.month;
        return day < other.day;
    }
};

Полезный приём — Implement другие операторы сравнения через те, которые вы уже определили. Как только у вас есть == и <, остальные следуют естественным образом:

bool operator!=(const Date& other) const {
    return !(*this == other);
}

bool operator>(const Date& other) const {
    return other < *this;
}

bool operator<=(const Date& other) const {
    return !(other < *this);
}

bool operator>=(const Date& other) const {
    return !(*this < other);
}

Такой подход сокращает дублирование кода и гарантирует, что all ваши comparison operators работают согласованно. Если позже вы измените принцип работы равенства или оператора «меньше», other operators автоматически останутся синхронизированными.

challenge icon

Задание

Легко

Давайте создадим Version class, который представляет номера версий программного обеспечения (например, 2.1.0 или 3.0.5) и поддерживает все шесть операторов сравнения. Это практический пример использования, где сравнение версий определяет, какое программное обеспечение является более новым, что отлично подходит для практики перегрузки операторов сравнения.

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

  • Version.h: определите Version class, который хранит три integers, представляющих номера версий major, minor и patch. Ваш class должен поддерживать:
    • Constructor, принимающий значения major, minor и patch
    • Getters для каждого компонента: getMajor(), getMinor(), getPatch() (все const)
    • Все шесть операторов сравнения: ==, !=, <, >, <=, >=
    • Метод toString(), который возвращает версию в виде string в формате "major.minor.patch"

    Реализуйте == и < напрямую, затем определите оставшиеся четыре оператора через эти два. Для сравнения «меньше чем» сначала сравнивайте major, затем minor, если значения major равны, и затем patch, если значения major и minor равны. Все операторы сравнения должны быть const member functions.

  • main.cpp: считайте из входных данных шесть integers, представляющих две версии (major1, minor1, patch1, major2, minor2, patch2 в отдельных строках). Создайте два объекта Version и сравните их, используя все свои операторы.

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

    Version 1: <v1>
    Version 2: <v2>
    v1 == v2: <true/false>
    v1 != v2: <true/false>
    v1 < v2: <true/false>
    v1 > v2: <true/false>
    v1 <= v2: <true/false>
    v1 >= v2: <true/false>

    Выводите true или false (в lowercase) для каждого результата сравнения.

Ключевой приём здесь — реализация четырёх производных операторов (!=, >, <=, >=) с использованием только == и <. Это уменьшает дублирование кода и гарантирует согласованность всех операторов, если вы когда-нибудь измените логику сравнения.

Преобразуйте входные string в integers с помощью std::stoi(). Используйте std::to_string() для построения строки версии. Не забудьте добавить header guards в свой header file.

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

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

using namespace std;

int main() {
    // Прочитать шесть целых чисел для двух версий
    string line;
    
    getline(cin, line);
    int major1 = stoi(line);
    
    getline(cin, line);
    int minor1 = stoi(line);
    
    getline(cin, line);
    int patch1 = stoi(line);
    
    getline(cin, line);
    int major2 = stoi(line);
    
    getline(cin, line);
    int minor2 = stoi(line);
    
    getline(cin, line);
    int patch2 = stoi(line);

    // TODO: Создать два объекта Version
    
    // TODO: Вывести Version 1 и Version 2 с помощью toString()
    
    // TODO: Сравнить с использованием всех шести операторов и вывести результаты
    // Используйте "true" или "false" (в нижнем регистре) для каждого сравнения
    // Формат: "v1 == v2: true" или "v1 == v2: false"
    
    return 0;
}
quiz iconПроверьте себя

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

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

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