No one has mentioned speed, so I'll just add this tid-bit:
Passing by reference or pointer is frequently faster than passing by value (so long as the size of a pointer is < the size of the value)
Returning/passing by reference is faster (same as returning by a pointer) than returning by value if sizeof(object) > sizeof(void *)
, or in other words, if the size of the object being returned is larger than the size of any pointer on the system (all pointers on a given system have the same size), which is 8 bytes on most systems.
So, if you're returning any integer, float, or double type, returning by value is as fast or faster than returning by pointer. If you're returning a 9 byte, 10 byte, or 1200 byte object, however, returning by reference or pointer is faster, and much much faster for the 1200-byte-object case.