Желательно не объявлять функции друзьями, если они могут быть реализованы в терминах открытого интерфейса класса (например, operator+
в терминах члена operator+=
.
Почему-то с операторами иногда люди склонны считать, что при реализации в качестве бесплатных функций они должны автоматически объявляться друзьями. Например, вы можете услышать, что operator<<
не может быть реализован как функция-член (потому что левый операнд является ostream), поэтому он должен быть свободной friend функцией. В действительности он должен быть другом только в том случае, если ему нужен доступ к закрытым / защищенным членам и функциям.
(Я подозреваю, что это может быть из-за того, что перегруженные операторы из-за их особого синтаксиса вызова не чувствуют себя как нормальные функции и, кажется, имеют какую-то магическую связь со своими операндами, которую необходимо выразить в определении класса.)