Допустим мы хотим сохранить массив экземпляров одного объекта один раз в памяти и далее хотим в программе использовать доступ к его данным многократно.
Мы будем ссылаться на массив (и на значения массива) через ссылки или указатели.
Можно просто использовать массив объектов. Например:
Class1 arr[10];
Но можно использовать и массив указателей на экземпляры объектов.
Class1 *arr[10];
Что же лучше?
Чтобы не плодить многократно копии экземпляра какого-то объекта надо ответить сначала на вопрос когда первый раз и где создается объект.
Class1 obj; // создает экземпляр объекта Class1 на стеке
Class1 *obj = new Class1(); // создает экземпляр объекта Class1 , но в куче
Теперь у нас есть массив объектов Class1 и массив указателей на Class1:
Class1 arr1[10];
Class1 *arr2[10];
arr1[0] = obj; // на самом деле создает копию obj
arr2[0] = &obj; // создает указатель на obj
Небольшой пример : если мы используем функцию для заполнения массива arr1:
void func1(Class1& obj)
{
arr1[1] = obj; // может показаться, что мы получаем в arr1[1] ссылку на obj
// но на самом деле в arr1[1] мы получаем копию obj !!
}
Объект таким образом конечно надо создавать один раз , а потом с ним работать через указатели.
Если мы этот объект передадим далее по ссылке , например в конструктор другого класса, то там будет создана тоже копия нашего объекта:
class Class2
{
public:
Class1 cl1;
Class2::Class2(Class1 &obj)
{
cl1 = obj; // на самом деле в cl1 мы получаем копию obj !!
// это видно по значениям адресов в памяти cl1 и obj
}
};
Но мир придумал контейнерные классы с целью удобства добавления, удаления значений массива в любом месте контейнера (в начале, в конце, в середине).
Еще всегда можно получить count всех элементов.
Может показаться ,что контейнерные классы (QMap, QList, ...) обеспечивают доступ к экземпляру объекта, но на самом деле каждый раз при обращении к экземпляру создают копию экземпляра и обеспечивают чтение данных для копии экземпляра. Это может быть очень накладно.
Это например QMap, QList . Их value() и [] возвращает копию значения.
Таким образом получается, что выгоднее хранить в массиве (контейнере) указатели на экземпляры объектов.