Как правило, только операторы, которые реализованы в виде бесплатных функций, которым действительно необходим доступ к частным или защищенным данным класса, с которым они работают, должны быть объявлены как друзья, в противном случае они должны быть просто не-дружественными функциями, не являющимися членами.
Как правило, единственные операторы, которые я реализую как функции-члены, - это операторы, которые в основном асимметричны и в которых операнды не имеют эквивалентных ролей. В качестве членов я обычно использую те, которые должны быть членами: простое присваивание, ()
, []
и ->
вместе с составными операторами присваивания, унарные операторы и, возможно, некоторые перегрузки <<
и >>
для классов, которые сами являются потоковыми или потоковыми классами. Я никогда не перегружаю &&
, ||
или ,
.
Все остальные операторы, которые я стремлюсь реализовать как свободные функции, предпочтительно используя открытый интерфейс классов, с которыми они работают, прибегают к дружбе только при необходимости.
Сохранение таких операторов, как !=
, ==
, <
, +
, /
и т. Д., В качестве функций, не являющихся членами, позволяет идентично обрабатывать левый и правый операнды относительно последовательностей неявного преобразования, что помогает уменьшить количество удивительных асимметрий.