Classes and class hierarchies
C.167
Используйте оператор для операции с его традиционным значением
Причина
Читаемость. Соглашение. Переиспользуемость. Поддержка обобщённого кода
Пример
void cout_my_class(const My_class& c) // сбивает с толку, нетрадиционно, необобщённо
{
std::cout << /* члены класса здесь */;
}
std::ostream& operator<<(std::ostream& os, const my_class& c) // OK
{
return os << /* члены класса здесь */;
}
Сам по себе cout_my_class был бы в порядке, но его нельзя использовать/компоновать с кодом, опирающимся на соглашение << для вывода:
My_class var { /* ... */ };
// ...
cout << "var = " << var << '\n';
Примечание
Существуют строгие и живые соглашения о значении большинства операторов, например
- операторы сравнения (
==,!=,<,<=,>,>=и<=>), - арифметические операции (
+,-,*,/и%) - операторы доступа (
.,->, унарный*и[]) - присваивание (
=)
Не определяйте их нетрадиционным образом и не изобретайте собственные имена для них.
Контроль
Сложно. Требует семантического понимания.