Este es un ejemplo simplificado para ilustrar la pregunta:
class A {};
class B
{
B(A& a) : a(a) {}
A& a;
};
class C
{
C() : b(a) {}
A a;
B b;
};
Entonces B es responsable de actualizar una parte de C. Ejecuté el código a través de lint y se quejó sobre el miembro de referencia: lint # 1725 . Esto habla de tener cuidado con la copia predeterminada y las asignaciones, lo cual es bastante justo, pero la copia predeterminada y la asignación también son malas con los punteros, por lo que hay poca ventaja allí.
Siempre trato de usar referencias donde puedo, ya que los punteros desnudos introducen incertidumbre sobre quién es responsable de eliminar ese puntero. Prefiero incrustar objetos por valor, pero si necesito un puntero, uso auto_ptr en los datos de miembros de la clase que posee el puntero y paso el objeto como referencia.
En general, solo usaría un puntero en los datos del miembro cuando el puntero podría ser nulo o podría cambiar. ¿Hay alguna otra razón para preferir punteros sobre referencias para miembros de datos?
¿Es cierto decir que un objeto que contiene una referencia no debe ser asignable, ya que una referencia no debe cambiarse una vez inicializada?