Разница между передачей по ссылке или по значению контейнера указателей - PullRequest
0 голосов
/ 04 декабря 2018

Как правило, в C ++ мне известны различия между синтаксическим анализом по значению, либо по ссылке, либо по указателю, но я путаюсь при передаче контейнеров.

Мой вопрос: в чем разница передачи по ссылке или по значению контейнера указателей.А также в чем разница передачи по ссылке контейнера не указателей и передачи по значению контейнера указателей.

Более конкретно, в обоих приведенных ниже вопросах, что произойдет, если функция 'func ()' изменит значениеАргумент 'myClass':

  1. в чем разница между:

    void func(list<myClass*> myList);
    

    и

    void func(list<myClass*> &myList); 
    
  2. в чем разницамежду:

    void func(list<myClass> &myList);
    

    и

    void func(list<myClass*> myList);
    

РЕДАКТИРОВАТЬ: Если вы хотите, чтобы изменения вызывающей функции отражались на исходном объекте, какие опции у вас естьи в чем их разница?Насколько я понимаю, у вас есть следующие варианты:

 void func(list<myClass*>& myList); 

или

 void func(list<myClass>& myList); 

1 Ответ

0 голосов
/ 04 декабря 2018
void func(list<*myClass> myList);

Этот вызов копирует аргумент и создает новый список.Любая модификация в этой копии не будет отражена в вызывающем аргументе.

void func(list<*myClass>& myList); 

Этот вызов не копирует аргумент.Любая модификация списка будет отражена в исходном списке (поскольку он его использует), поскольку аргумент ссылается на этот список.

void func(const list<*myClass>& myList);

В общем, люди используют const list<*myClass>&, чтобы избежать копирования и запретитьмодификации.

void func(list<myClass>* myList);

Я предполагаю, что это вопрос, который вы хотели задать вместо list<*myClass>.Так что это передает указатель вместо ссылки.Это означает, что myList может не существовать, в отличие от ссылки, которая должна ссылаться на существующий объект.Это часто используется для необязательных аргументов.

void func(list<myClass> myList);

Видимо, я ошибся, и это реальное сравнение.

Это просто еще один объект, нет способа конвертировать list<myClass> в list<*myClass>.Список указателей может быть интересен, если myClass является виртуальным, если они управляются где-либо еще.

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

...