указатели и ссылки передаем в функцию и возвращаем из нее

Допустим мы хотим сохранить массив экземпляров одного объекта один раз в памяти и далее хотим в программе использовать доступ к его данным многократно.

Мы будем ссылаться на массив (и на значения массива) через ссылки или указатели.

Можно просто использовать массив объектов. Например:

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() и [] возвращает копию значения.

Таким образом получается, что выгоднее хранить в массиве (контейнере) указатели на экземпляры объектов.