Указатель может получить ПУСТОЙ параметр, параметр ссылки не может. Если существует когда-нибудь шанс, что Вы могли хотеть не передать "объект", то используют указатель вместо ссылки.
кроме того, передающий указателем позволяет Вам явно видеть на сайте вызова, передается ли объект значением или ссылкой:
// 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);
nothing
. Это может использоваться для обеспечения дополнительных аргументов. string s = &str1 + &str2;
указатели использования. void f(const T& t); ... f(T(a, b, c));
, указатели не могут использоваться как этот, так как Вы не можете взять адрес временного файла. "Достаточно Веревки Allen Holub для Стрельбы в в Ноге" перечисляет следующие 2 правила:
120. Reference arguments should always be `const`
121. Never use references as outputs, use pointers
Он перечисляет несколько причин, почему ссылки были добавлены к C++:
const
, ссылки позволяют Вам иметь семантику передачи значением при предотвращении копии , Его основной момент - то, что ссылки не должны использоваться в качестве 'выходных' параметров, потому что на сайте вызова нет никакого признака того, является ли параметр ссылкой или параметром, передаваемым по значению. Таким образом, его правило состоит в том, чтобы только использовать const
ссылки в качестве аргументов.
Лично, я думаю, что это - хорошее эмпирическое правило, поскольку оно делает его более ясным, когда параметр является выходным параметром или нет. Однако, в то время как я лично соглашаюсь с этим в целом, я действительно позволяю мне быть поколебленным мнениями других в моей команде, если они приводят доводы в пользу выходных параметров как в пользу ссылок (некоторые разработчики как они очень).
Разъяснения к предыдущим сообщениям:
<час>Ссылки НЕ гарантия получения ненулевого указателя. (Хотя мы часто рассматриваем их как таковой.)
, В то время как ужасающе плохой код, как в вынимают Вас позади дровника плохой код, следующее скомпилирует & выполненный: (По крайней мере, в соответствии с моим компилятором.)
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, в той же памяти, выделяемой двум различным объектам. Большая отладка забавы там...
<час>более практически:
Едва ли. Внутренне, передача ссылкой выполняется чрезвычайно передающим адрес ссылочного объекта. Так, действительно нет никакого увеличения эффективности, которое будет иметься путем передачи указателя.
Передача ссылкой действительно обладает одним преимуществом, как бы то ни было. У Вас, как гарантируют, будет экземпляр любого объекта/типа, который передается в. Если Вы передаете в указателе, то Вы рискуете получать Нулевого указателя. При помощи передачи ссылкой Вы продвигаете неявную ПУСТУЮ проверку один уровень вызывающей стороне Вашей функции.