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

StackOverflow https://stackoverflow.com/questions/937585

Вопрос

являются ли PHP и C++ единственными двумя местами, где нам нужно соблюдать осторожность при передаче переменной простого типа данных в качестве аргумента функции, и ее значение можно изменить?

такой как

$count = 2;
foo($count);
echo $count;

и в третьей строке echo $count отображается значение, отличное от 2.Я знаю только PHP и C++, где это может произойти.Есть ли другое место, где это может произойти?

Обновлять: то есть то, что выглядит как «передача по значению», на самом деле является «передачей по ссылке».Если он передает объект в Java, Perl, PHP, Python и Ruby, он автоматически передается по ссылке, и значения переменных экземпляра объекта могут быть изменены.А как насчет передачи необъекта?

Это было полезно?

Решение

Многие другие языки поддерживают такую ​​​​передачу по ссылке — Perl, Fortran, Pascal, Visual Basic,...

Какие именно вас волнуют, ну нам сложно сказать!-)

Редактировать:В своем обновлении вы поместили Java и Python в одну категорию, но это неправильно:вы не смогли воспроизвести свой пример с помощью (Java):

  int count = 2;
  whatever(count);
  /* count here is CERTAIN to be still 2 */

или (Питон):

count = 2
whatever(count)
# count here is CERTAIN to be still 2

Стиль Python и Java иногда называют «по ссылке на объект» (в отличие от «по ссылке на переменную»):то, что передается (или назначается), является ссылкой на объект (поэтому, ЕСЛИ у объекта есть мутаторы, вызываемая сторона может вызвать эти мутаторы и, таким образом, изменить объект), НЕ на «переменную» (так что после вызова переменная, если таковая имеется, используется для передачи аргумента, по-прежнему относится к тому же объекту, а не к другому объекту).Это различие наиболее четко видно на неизменяемых объектах, таких как (как в Java, так и в Python) числа и строки.

Другие советы

Вы не можете изменить переменную в C++, если не явно определить его как ссылку.Если у вас есть обычные (не ссылочные) аргументы, они являются копиями и могут нет быть изменен.Если вы читаете и понимаете API, то нет необходимости будьте осторожны при передаче простой переменной типа данных в качестве аргументов функции..

void func(type & arg);

можно изменить и

void func(type arg);

не мочь.И обычно в C++ это не будет ссылочным аргументом, если только API не захочет изменить значение в первую очередь (выходной параметр).

И, как уже упомянул Алекс, существует множество языков, поддерживающих передать по ссылке идиома.

Вам нужно будет быть осторожным только в том случае, если язык не позволяет этого сделать. прозрачный если передана переменная по стоимости или по ссылке.

Раньше в FORTRAN константы передавались по ссылке.Вы можете передать константу 2 в подпрограмму, и подпрограмма может присвоить ей 3.Затем после возвращения этот код

x = 2 + 2

установил бы x равным 6.Я не знаю, позволяют ли это современные компиляторы FORTRAN.

После обсуждения выше, недавно я узнал, что использование термина «передача по ссылке» в языке программирования является довольно строгим, и, например, в Java на самом деле это просто передача по значению, строго говоря.

Либо вы передаете примитив по значению (как я предполагал, всем понятно), либо передаете ссылку на объект по значению.Хорошо, теперь я понимаю, но рассмотрим следующий код Perl.

sub addFoo {
  my ($arrayRef) = @_;
  push @{$arrayRef},"foo"; 
}

my @array = (1,2,3);
my $arrayRef; # FUTURE reference (equivalent to pointer C) to @array.

addFoo($arrayref = \@array); #1.
addFoo(\@array); #2.
addFoo($arrayRef); #3.

print join(" ",@array),"\n"; # result "1 2 3 foo foo foo\n";

Мой вопрос: какой из трех альтернативных вызовов addFoo считается передачей по ссылке, а не передачей-A-ссылкой?Кажется, для номера три ответ ясен, но для номера №1 я сказать не могу.№2.как и делают то же самое.По крайней мере, число 2 явно рассматривается как передача по ссылке на некоторых страницах руководства Perl и веб-сайтах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top