Existe-t-il un nom pour décrire cet idiome ?
En UML, cela s'appelle l'agrégation. Elle diffère de la composition dans la mesure où l'objet membre n'est pas appartenant à par la classe de référence. En C++, vous pouvez implémenter l'agrégation de deux manières différentes, par le biais de références ou de pointeurs.
Je suppose que c'est pour éviter l'éventuelle surcharge de la copie d'un gros objet complexe ?
Non, ce serait une très mauvaise raison d'utiliser ça. La principale raison de l'agrégation est que l'objet contenu n'appartient pas à l'objet contenant et que leurs durées de vie ne sont donc pas liées. En particulier, la durée de vie de l'objet référencé doit dépasser celle de l'objet référent. Il peut avoir été créé bien plus tôt et peut vivre au-delà de la fin de vie du conteneur. En outre, l'état de l'objet référencé n'est pas contrôlé par la classe, mais peut changer de manière externe. Si la référence n'est pas const
alors la classe peut changer l'état d'un objet qui vit en dehors d'elle.
Est-ce une bonne pratique en général ? Y a-t-il des pièges à cette approche ?
Il s'agit d'un outil de conception. Dans certains cas, ce sera une bonne idée, dans d'autres non. Le piège le plus courant est que la durée de vie de l'objet contenant la référence ne doit jamais dépasser la durée de vie de l'objet référencé. Si l'objet englobant utilise la référence après l'objet référencé a été détruit, vous aurez un comportement indéfini. En général, il est préférable de préférer la composition à l'agrégation, mais si vous en avez besoin, c'est un outil comme un autre.