Чи існує назва, що описує цю ідіому?
В UML це називається агрегацією. Він відрізняється від композиції тим, що об’єкт-член не належить референтному класу. У C ++ ви можете реалізувати агрегування двома різними способами, за допомогою посилань або покажчиків.
Я припускаю, що це для запобігання можливим великим накладним витратам на копіювання великого складного об'єкта?
Ні, це було б дійсно поганою причиною використовувати це. Основною причиною агрегації є те, що вміщений об'єкт не належить вміщуваному об'єкту, і, отже, їх життєвий цикл не пов'язаний. Зокрема, час життя об’єкта, на який посилається, повинен пережити той, на який йде посилання. Можливо, він був створений набагато раніше і міг жити після закінчення терміну служби контейнера. Крім того, стан об'єкта, на який посилається, не контролюється класом, але може змінюватися зовні. Якщо посилання немає const
, тоді клас може змінити стан об'єкта, який живе поза ним.
Це загалом хороша практика? Чи є у цього підходу підводні камені?
Це інструмент проектування. У деяких випадках це буде гарна ідея, в деяких - ні. Найбільш поширеною помилкою є те, що час життя об’єкта, що містить посилання, ніколи не повинен перевищувати час життя об’єкта, на який посилається. Якщо об'єкт, що включає, використовує посилання після знищення об'єкта, на який посилається, у вас буде невизначена поведінка. Загалом краще віддати перевагу композиції, а не агрегації, але якщо вона вам потрібна, це такий же хороший інструмент, як і будь-який інший.