14.3.2. Операторы отношения
Классы, для которых определен оператор равенства, зачастую (но не всегда) обладают операторами отношения. В частности, это связано с тем, что ассоциативные контейнеры и некоторые из алгоритмов используют оператор меньше (operator<).
Обычно операторы отношения должны определять следующее.
1. Порядок отношений, совместимый с требованиями для ключей ассоциативных контейнеров (см. раздел 11.2.2);
2. Отношение, совместимое с равенством, если у класса есть оба оператора. В частности, если два объекта не равны, то один объект должен быть меньше другого.
Вполне резонно предположить, что класс Sales_data должен поддерживать операторы отношения, хотя это и не обязательно. Причины не столь очевидны, поэтому рассмотрим их подробнее.
Можно подумать, что оператор < будет определен так же, как функция compareIsbn() (см. раздел 11.2.2). Эта функция сравнивала объекты класса Sales_data за счет сравнения их ISBN. Хотя функция compareIsbn() обеспечивает порядок отношений, что соответствует первому требованию, она возвращает результат, противоречащий определению равенства. В результате она не удовлетворяет второму требованию.
Оператор == класса Sales_data считает две транзакции с одинаковым ISBN неравными, если у них отличаются значения переменных-членов revenue или units_sold. Если бы оператор < был определен как сравнивающий только значения ISBN, то два объекта с одинаковым ISBN, но разными units_sold или revenue считались бы неравными, но ни один из объектов не был бы меньше другого. Как правило, если имеются два объекта, ни один из которых не меньше другого, то вполне логично ожидать, что эти объекты равны.
Создается впечатление, что имеет смысл определить оператор operator< для сравнения каждой переменной-члена по очереди. Его можно было бы определить так, чтобы при равных isbn объекты сравнивались по переменной-члену units_sold, а затем revenue.
Однако никаких оснований для упорядочивания здесь нет. В зависимости от того, как планируется использовать класс, определить порядок можно сначала на основании переменных revenue и units_sold. Можно было бы установить, что объекты с меньшим значением переменной units_sold были "меньше", чем таковые с большим. Либо можно было бы установить, что объекты с меньшим значением переменной-члена revenue "меньше", чем таковые с большим значением.
Для класса Sales_data нет единого логического определения значения "меньше". Таким образом, для этого класса лучше вообще не определять оператор operator<.
Если есть однозначное логическое определение значения "меньше", то классы обычно должны определять оператор operator<. Но если у класса есть также оператор operator==, то определяйте оператор operator<, только если определения смысла понятий "меньше" и "равно" не противоречат друг другу.
Упражнения раздела 14.3.2
Упражнение 14.18. Определите операторы отношения для классов StrBlob, StrBlobPtr, StrVec и String.
Упражнение 14.19. Определяет ли класс, выбранный в упражнении 7.40 раздел 7.5.1, операторы отношения? Если да, то реализуйте их. В противном случае объясните, почему нет.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОК