14.3.1. Операторы равенства
Классы языка С++ используют оператор равенства для проверки эквивалентности объектов. Он сравнивает каждую переменную-член обоих объектов и признает их равными, если все значения одинаковы. В соответствии с этой концепцией оператор равенства класса Sales_data должен сравнить переменные bookNo двух объектов, а также значения их остальных переменных.
bool operator==(const Sales_data &lhs, const Sales_data &rhs) {
return lhs.isbn() == rhs.isbn() &&
lhs.units_sold == rhs.units_sold &&
lhs.revenue == rhs.revenue;
}
bool operator!=(const Sales_data &lhs, const Sales_data &rhs) {
return !(lhs == rhs);
}
Определение этих функций тривиально. Однако важнее всего принципы, которые здесь используются.
• Если в классе определен оператор, позволяющий выяснить равенство двух объектов данного класса, его функция должна иметь имя operator==. Не стоит изобретать для нее другое имя, поскольку пользователи ожидают, что для сравнения объектов можно использовать именно оператор ==. Кроме того, это гораздо проще, чем каждый раз запоминать новые имена.
• Если в классе определен оператор ==, то два объекта могут содержать одинаковые данные.
• Обычно оператор равенства должен быть транзитивным, т.е. если оба выражения, а == b и b == с, являются истинными, то а == с тоже должно быть истиной.
• Если в классе определен оператор operator==, следует также определить и оператор operator!=. Пользователи вполне резонно будут полагать, что если применимо равенство, то применимо и неравенство.
• Определяя операторы равенства и неравенства, почти всегда имеет смысл использовать один из них для создания другого. Один оператор должен фактически сравнивать объекты, а второй — использовать его в своих целях.
Классы, в которых определен оператор operator==, гораздо проще использовать со стандартной библиотекой. Если оператор == определен в классе, то такие алгоритмы к нему можно применять без всякой дополнительной подготовки.
Упражнения раздела 14.3.1
Упражнение 14.16. Определите операторы равенства и неравенства для классов StrBlob (см. раздел 12.1.1), StrBlobPtr (см. раздел 12.1.6), StrVec (см. раздел 13.5) и String (см. раздел 13.5).
Упражнение 14.17. Должен ли класс, выбранный в упражнении 7.40 раздела 7.5.1, определять операторы равенства? Если да, то реализуйте их. В противном случае объясните, почему нет.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОК