es PHP y C ++ los únicos 2 lugares que tenemos que cuidado con lo que parece ser el paso por valor es de hecho el paso por referencia?

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

Pregunta

es PHP y C ++ los únicos 2 lugares que tenemos que cuidado con pasar una variable de tipo de datos simple como un argumento de la función y el valor se puede cambiar?

como

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

y la tercera línea, $ eco pantalla del contador de algo que no sea 2. Sólo sé de PHP y C ++ en los que puede pasar. ¿Hay algún otro lugar donde pueda pasar?

Actualización: es decir, lo que se ve como "paso por valor" es, de hecho, "el paso por referencia". Si se pasa un objeto en Java, Perl, PHP, Python, y Ruby, se pasan por referencia automáticamente y valores del objeto las variables de instancia se puede cambiar. ¿Qué hay de pasar de no-objeto?

¿Fue útil?

Solución

Muchos otros idiomas de apoyo "pasan por referencia" tal - Perl, Fortran, Pascal, Visual Basic, ...

¿Cuáles usted quiere, así, es difícil para nosotros decir! -)

Editar: En su actualización, se pone de Java y Python en la misma categoría, pero eso está mal: no se podía reproducir el ejemplo, con (Java):

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

o (Python):

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

estilo de Python y Java se conoce a veces como "por referencia a un objeto" (en lugar de "por referencia variable"): lo que pasa (o asignado) es una referencia al objeto (por lo que si el objeto tiene mutators el destinatario de la llamada puede invocar esos mutators y por lo tanto alteran el objeto), no a una "variable" (de modo que después de la llamada de la variable, en su caso, que se utiliza para pasar el argumento, todavía se refiere al mismo objeto, no a otro objeto). Esta distinción es más claro ver con objetos inmutables, como (en Java y Python) números y cadenas.

Otros consejos

No se puede alterar una variable en C ++ a menos que explícitamente definirlo como referencia. Si usted tiene argumentos (de referencia) no regulares, que son ejemplares y pueden no ser cambiado. Si ha leído y comprendido la API, entonces no hay necesidad de ser cuidado con pasar una variable de tipo de datos simple como una función argumentos .

void func(type & arg);

se puede cambiar y

void func(type arg);

No se puede. Y por lo general en C ++ que no será un argumento de referencia a menos que el API quieren es el valor a cambiar en el primer lugar (parámetro de salida).

Y como Alex ya se ha mencionado, hay muchos lenguajes que soportan el el paso por referencia idioma.

Usted sólo necesita tener cuidado si una lengua hace que no sea Borrar si una variable se pasa por valor o referencia .

En los viejos días, FORTRAN pasaron constantes por referencia. Se podía pasar la constante 2 a una subrutina y la subrutina 3 podría asignar a la misma. A continuación, después de regresar, este código

x = 2 + 2

fijaría xa 6. No sé si modernos compiladores FORTRAN permiten que esto suceda.

Después de la discusión anterior, hace poco me enteré de que y lenguaje de programación diseño uso del término "pasan por referencia" es más bien muy estricto, y por ejemplo en Java es, de hecho, sólo tiene que pasar por valor, en sentido estricto.

O, se pasa una primitiva por valor (claro a todo el mundo que se supone) o se pasa una referencia a un objeto de valor. Ok que entiendo ahora todavía considerar el siguiente código de 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";

Mi pregunta si cuál de las tres llamadas alternativas a addFoo, se considera pase por referencia en lugar de Pass-a-referencia? Parece que la respuesta es clara para el número tres, pero no puedo decir con número # 1. # 2. como están haciendo exactamente lo mismo. Al menos el número 2 se considera explícitamente como el paso por referencia en algunas páginas de manual de Perl y sitios web.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top