Есть ли преимущества передачи указателем по передаче ссылкой в C++?

220
задан Sobi 17 August 2016 в 19:13
поделиться

5 ответов

Указатель может получить ПУСТОЙ параметр, параметр ссылки не может. Если существует когда-нибудь шанс, что Вы могли хотеть не передать "объект", то используют указатель вместо ссылки.

кроме того, передающий указателем позволяет Вам явно видеть на сайте вызова, передается ли объект значением или ссылкой:

// Is mySprite passed by value or by reference?  You can't tell 
// without looking at the definition of func()
func(mySprite);

// func2 passes "by pointer" - no need to look up function definition
func2(&mySprite);
212
ответ дан Lightness Races with Monica 23 November 2019 в 04:07
поделиться

Передача указателем

  • Вызывающая сторона должна взять адрес-> не прозрачный
  • А, который 0 значений могут быть обеспечены для значения nothing. Это может использоваться для обеспечения дополнительных аргументов.

Передача ссылкой

  • Вызывающая сторона просто передает объект-> прозрачный. Должен использоваться для перегрузки оператора, начиная с перегрузки для типов указателей не возможно (указатели являются встроенными типами). Таким образом, Вы не можете сделать string s = &str1 + &str2; указатели использования.
  • возможные значения № 0-> Вызванная функция не должна проверять на них
  • , Ссылка на константу также принимает временные файлы: void f(const T& t); ... f(T(a, b, c));, указатели не могут использоваться как этот, так как Вы не можете взять адрес временного файла.
  • Наконец, что не менее важно, ссылки легче использовать-> меньше шанса для ошибок.
236
ответ дан Johannes Schaub - litb 23 November 2019 в 04:07
поделиться

"Достаточно Веревки Allen Holub для Стрельбы в в Ноге" перечисляет следующие 2 правила:

120. Reference arguments should always be `const`
121. Never use references as outputs, use pointers

Он перечисляет несколько причин, почему ссылки были добавлены к C++:

  • они необходимы для определения конструкторов копии
  • , они необходимы для перегрузок оператора
  • const, ссылки позволяют Вам иметь семантику передачи значением при предотвращении копии

, Его основной момент - то, что ссылки не должны использоваться в качестве 'выходных' параметров, потому что на сайте вызова нет никакого признака того, является ли параметр ссылкой или параметром, передаваемым по значению. Таким образом, его правило состоит в том, чтобы только использовать const ссылки в качестве аргументов.

Лично, я думаю, что это - хорошее эмпирическое правило, поскольку оно делает его более ясным, когда параметр является выходным параметром или нет. Однако, в то время как я лично соглашаюсь с этим в целом, я действительно позволяю мне быть поколебленным мнениями других в моей команде, если они приводят доводы в пользу выходных параметров как в пользу ссылок (некоторые разработчики как они очень).

62
ответ дан Michael Burr 23 November 2019 в 04:07
поделиться

Разъяснения к предыдущим сообщениям:

<час>

Ссылки НЕ гарантия получения ненулевого указателя. (Хотя мы часто рассматриваем их как таковой.)

, В то время как ужасающе плохой код, как в вынимают Вас позади дровника плохой код, следующее скомпилирует & выполненный: (По крайней мере, в соответствии с моим компилятором.)

bool test( int & a)
{
  return (&a) == (int *) NULL;
}

int
main()
{
  int * i = (int *)NULL;
  cout << ( test(*i) ) << endl;
};
<час>

реальная проблема, которую я имею со ссылками, находится с другими программистами, которых впредь называют ИДИОТЫ , кто выделяет в конструкторе, освобождает в деструкторе, и не удается предоставить конструктора копии или оператор = ().

Внезапно существует мир различия между нечто (панель ПАНЕЛИ) и нечто (ПАНЕЛЬ & панель) . (Автоматическая поразрядная операция копии вызывается. Освобождение в деструкторе вызывается дважды.)

К счастью современные компиляторы возьмут это двойное освобождение того же указателя. 15 лет назад они не сделали. (Под gcc/g ++, используйте setenv MALLOC_CHECK_ 0 для пересматривания старых путей.) Получающийся, в соответствии с DEC UNIX, в той же памяти, выделяемой двум различным объектам. Большая отладка забавы там...

<час>

более практически:

  • Ссылки скрывают это, Вы еще изменяете данные, хранившие где-нибудь.
  • легко перепутать Ссылку со Скопированным объектом.
  • Указатели делают его очевидным!
9
ответ дан Mr.Ree 23 November 2019 в 04:07
поделиться

Едва ли. Внутренне, передача ссылкой выполняется чрезвычайно передающим адрес ссылочного объекта. Так, действительно нет никакого увеличения эффективности, которое будет иметься путем передачи указателя.

Передача ссылкой действительно обладает одним преимуществом, как бы то ни было. У Вас, как гарантируют, будет экземпляр любого объекта/типа, который передается в. Если Вы передаете в указателе, то Вы рискуете получать Нулевого указателя. При помощи передачи ссылкой Вы продвигаете неявную ПУСТУЮ проверку один уровень вызывающей стороне Вашей функции.

3
ответ дан Brian 23 November 2019 в 04:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: