¿Hay un nombre para describir este idioma?
En UML se llama agregación. Se diferencia de la composición en que el objeto miembro no es propiedad de la clase de referencia. En C ++ puede implementar la agregación de dos formas diferentes, mediante referencias o punteros.
¿Supongo que es para evitar la sobrecarga posiblemente grande de copiar un objeto complejo grande?
No, esa sería una muy mala razón para usar esto. La razón principal de la agregación es que el objeto contenido no es propiedad del objeto contenedor y, por lo tanto, su vida útil no está limitada. En particular, la vida útil del objeto referenciado debe sobrevivir a la de referencia. Es posible que se haya creado mucho antes y que viva más allá del final de la vida útil del contenedor. Además de eso, el estado del objeto referenciado no está controlado por la clase, pero puede cambiar externamente. Si la referencia no lo es const
, entonces la clase puede cambiar el estado de un objeto que vive fuera de él.
¿Es esta una buena práctica en general? ¿Hay dificultades en este enfoque?
Es una herramienta de diseño. En algunos casos será una buena idea, en otros no. El error más común es que la vida útil del objeto que contiene la referencia nunca debe exceder la vida útil del objeto referenciado. Si el objeto adjunto usa la referencia después de que se destruyó el objeto al que se hace referencia, tendrá un comportamiento indefinido. En general, es mejor preferir la composición a la agregación, pero si lo necesita, es una herramienta tan buena como cualquier otra.