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

  Юрий  | 

    | 

  Обновл. 23 Июн 2019  | 

 8505

 ǀ   10 

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

Например, перегрузим операторы равенства == и != для класса Car:

Всё просто. Поскольку результат выполнения оператора != является прямо противоположным результату выполнения оператора ==, то мы определили оператор != используя уже перегруженный оператор == (уменьшив, таким образом, количество кода, сложность и возможность возникновения ошибок).

А как насчёт операторов < и >? Здесь нужно определиться, чем один объект класса Car может быть лучше другого объекта класса Car, и как это всё выразить в коде. Неочевидно! Поэтому здесь мы и не перегружали операторы < и >.

Совет: Не перегружайте операторы, которые будут бессмысленны для вашего класса.

Однако, операторы < и > можно использовать для сортировки списка автомобилей (объектов класса Car) в алфавитном порядке, используя члены m_company и m_model. Поэтому всегда рассматривайте разные варианты.

Некоторые классы-контейнеры (классы, которые содержат группы других классов) стандартной библиотеки C++ требуют перегрузки оператора <, чтобы они могли сохранять отсортированные элементы.

Перегрузим операторы сравнения >, <, >= и <=:

Всё просто.

Но, как вы уже могли бы заметить, операторы > и <= являются логическими противоположностями, поэтому одного из них можно было бы определить через второй. Та же ситуация и с < и >=. Но, поскольку определения функций перегрузки столь просты, а операторы в строчке объявления функции так хорошо сочетаются с операторами в строчке возврата результата, то мы решили этого не делать.

Тест

Задание №1

Используя класс Dollars выше, перепишите операторы < и <=, используя их логические противоположности.

Ответ №1

Задание №2

Добавьте перегрузку операторов << и < в класс Car выше, чтобы следующий фрагмент кода:

Производил следующий результат:

(Ford, Mustang)
(Ford, Ranger)
(Renault, Duster)
(Renault, Logan)

Ответ №2


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (29 оценок, среднее: 4,86 из 5)
Загрузка...

Комментариев: 10

  1. Аватар Эвелина:

    Для меня отлично работает следующий вариант перегрузки оператора сравнения:

  2. Аватар kmish:

    Можно ли где-нить почитать как реализовано сравнение двух переменных типа std::string у оператора "<" ?
    Сначала сравниваются нулевые элементы, затем первые, вторые и т.д.?
    Или как-то по другому?

    1. Аватар Александр:

      С-строки сравниваются независимо от содержимого :))) сравниваются указатели

      std::string сравниваются лексикографически.

      Или, по простому, "По алфавиту".
      Т.е. да, сравниваются первые элементы (коды символов), если они равны, то вторые и т.д. до нахождения различия. Если различий нет, но одна из строк закончилась — значит она и есть "меньше".

      ЗЫ "по алфавиту" это очень условно… строчная 'a' будет "больше" заглавной 'A'. Сравнение идет именно по номерам символов

  3. Аватар subj:

    Мне иначе вот в голову взбрело написать:

    1. Аватар Валерий:

      Неправильно.
      Пример.
      Пара (AAA, ZZZ) должна быть меньше(AAAA, AA).
      А с учетом конкатенации AAAZZZ будет больше чем AAAAAA.

  4. Аватар Torgu:

    Тоже как вариант для оператора сравнения

    1. Аватар Валерий:

      Мой чемпион

  5. Аватар Герман:

    Не совсем ясно, как функция sort "подхватывает" оператор < для класса Car.

    1. Юрий Юрий:

      Функция sort является встроенным функционалом заголовочного файла vector, который вы подключаете. Можете детальнее поискать информацию о функции sort в Интернете.

      1. Аватар Александр:

        функция std::sort не имеет отношения к векторам. Она в заголовочном файле <algorythm> объявляется и работает со всеми контейнерами для которых определены итераторы, при этом для элементов контейнера должен быть определен оператор "меньше"

        Самый часто используемый синтаксис:
        std::sort(arr.begin(), arr.end()); — передаем указатель (итератор) на начало контейнера и терминальный указатель (итератор) (тот, который идет ЗА последним)
        для этой формы должен быть определен оператор "<" для элементов контейнера

        Можно без оператора "<":
        std::sort(arr.begin(), arr.end(), checker); — передаем дополнительно функцию-чекер, которая будет определять правила сортировки

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *