Czy jest jakaś nazwa opisująca ten idiom?
W UML nazywa się to agregacją. Różni się od kompozycji tym, że obiekt członkowski nie jest własnością klasy odsyłającej. W C ++ możesz zaimplementować agregację na dwa różne sposoby, poprzez odwołania lub wskaźniki.
Zakładam, że ma to zapobiec możliwie dużym obciążeniom związanym z kopiowaniem dużego złożonego obiektu?
Nie, to byłby naprawdę zły powód, aby tego używać. Głównym powodem agregacji jest to, że obiekt zawarty nie jest własnością obiektu zawierającego, a zatem ich okresy życia nie są ograniczone. W szczególności okres istnienia obiektu, do którego odwołuje się odwołanie, musi przeżyć ten, który się odwołuje. Mógł zostać utworzony znacznie wcześniej i może żyć dłużej niż do końca życia kontenera. Poza tym stan obiektu, do którego się odwołujemy, nie jest kontrolowany przez klasę, ale może zmieniać się zewnętrznie. Jeśli odniesienie nie jest const
, klasa może zmienić stan obiektu, który żyje poza nią.
Czy jest to ogólnie dobra praktyka? Czy są jakieś pułapki w tym podejściu?
To narzędzie do projektowania. W niektórych przypadkach będzie to dobry pomysł, w innych nie. Najczęstszą pułapką jest to, że czas życia obiektu zawierającego odniesienie nigdy nie może przekraczać czasu życia obiektu, do którego się odwołuje. Jeśli otaczający obiekt użyje odwołania po zniszczeniu obiektu, do którego się odwołuje, będziesz mieć niezdefiniowane zachowanie. Ogólnie lepiej jest preferować kompozycję od agregacji, ale jeśli jej potrzebujesz, jest to równie dobre narzędzie, jak każde inne.