For some time I\'ve been designing my class interfaces to be minimal, preferring namespace-wrapped non-member functions over member functions. Essentially following Scott Meyer
One practical advantage of writing functions as nonmember nonfriends is that doing so can significantly reduce the time it takes to thoroughly test and verify the code.
Consider, for example, the sequence container member functions insert
and push_back
. There are at least two approaches to implementing push_back
:
insert
(it's behavior is defined in terms of insert
anyway)insert
would do (possibly calling private helper functions) without actually calling insert
Obviously, when implementing a sequence container, you probably want to use the first approach. push_back
is just a special form of insert
and (to the best of my knowledge) you can't really get any performance benefit by implementing push_back
some other way (at least not for list
, deque
, or vector
).
However, to thoroughly test such a container, you have to test push_back
separately: since push_back
is a member function, it can modify any and all of the internal state of the container. From a testing standpoint, you should (must?) assume that push_back
is implemented using the second approach because it is possible that it could be implemented using the second approach. There is no guarantee that it is implemented in terms of insert
.
If push_back
is implemented as a nonmember nonfriend, it can't touch any of the internal state of the container; it must use the first approach. When you write tests for it, you know that it can't break the internal state of the container (assuming the actual container member functions are implemented correctly). You can use that knowledge to significantly reduce the number of tests that you need to write to fully exercise the code.