Функции Friend существуют для представления свободных функций как непрерывной части интерфейса класса. Есть несколько мест, где свободные функции являются частью интерфейса класса. Пример. Предположим, у вас есть класс произвольной точности BigNum
. Вот несколько очевидных кандидатов на функции друзей:
// binary operators where BigNum isn't the left-hand operand
BigNum operator+ (int, BigNum);
BigNum operator- (int, BigNum);
// stream operators
std::ostream &operator<< (std::ostream &os, const BigNum &num);
std::istream &operator>> (std::istream &is, BigNum &num);
Теперь, учитывая эти два примера, во многих случаях бинарные операторы не должны быть друзьями (например, я могу реализовать int + BigNum
, делегировав BigNum + int
, который является функцией-членом и, таким образом, уже имеет полный доступ) , Но все зависит от ваших потребностей в производительности и от того, что вы хотите продемонстрировать через общедоступные функции класса.