¿Hay un nombre para describir este idioma?
En UML se llama agregación. Difiere de la composición en que el objeto miembro no es propiedad de por la clase de referencia. En C++ puede implementar la agregación de dos maneras diferentes, a través de referencias o punteros.
Supongo que es para evitar la posible gran sobrecarga de copiar un objeto grande y complejo?
No, esa sería una muy mala razón para usar esto. La razón principal para la agregación es que el objeto contenido no es propiedad del objeto contenedor y, por lo tanto, sus vidas no están vinculadas. En particular, la duración del objeto referenciado debe sobrevivir a la referencia. Puede haber sido creado mucho antes y podría vivir más allá del final de la vida útil del contenedor. Además de eso, el estado del objeto al que se hace referencia no está controlado por la clase, pero puede cambiar externamente. Si la referencia no es const
, la clase puede cambiar el estado de un objeto que vive fuera de él.
¿Es esta generalmente una buena práctica? ¿Hay algún inconveniente en este enfoque?
Es una herramienta de diseño. En algunos casos será una buena idea, en algunos no lo será. La falla más común es que la vida útil del objeto que contiene la referencia nunca debe exceder el tiempo de vida del objeto al que se hace referencia. Si el objeto adjunto utiliza la referencia después de el objeto al que se hace referencia se destruyó, tendrá un comportamiento indefinido. En general, es mejor preferir la composición a la agregación, pero si la necesita, es una herramienta tan buena como cualquier otra.
Un posible escollo es si el objeto al que hace referencia en la variable miembro se destruye en otro lugar e intenta acceder a él a través de su clase – mathematician1975