There are a few reasons why (inline) functions that return an appropriate reference are better:
A reference will require memory (typically the same amount as a pointer) in each object
References typically have the same alignment as pointers, thus causing the surrounding object to potentially require a higher alignment and thus wasting even more memory
Initializing a reference requires (a minuscule amount of) time
Having a member field of reference type will disable the default copy and move assignment operators since references are not reseatable
Having a member field of reference type will cause the automatically generated default copy and move constructors to be incorrect, since they will now contain references to the members of other objects
Functions can do additional checking like verifying invariants in debug builds
Be aware that due to inlining, the function will usually not incur any extra costs beyond a potentially slightly larger binary.