Nevertheless, the default position for any functionality should be that it is best to make it a non-friend, non-member function. If that isn't possible because of language rules (operator = and similar things) or because it needs access to class internals, make it a member function. If that isn't possible because it's an operator whose first argument isn't of the class type, make it a friend.