est PHP et C ++ seulement les 2 places que nous devons attention à ce qui ressemble à passer par la valeur est passe par référence en effet?

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

Question

est PHP et C ++ seulement les 2 places que nous devons attention à passer d'une simple variable de type de données comme argument de la fonction et la valeur peut être modifiée?

comme

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

et la 3ème ligne, quelque chose d'écho d'affichage de comptage de $ autre que 2. Je ne connais que de PHP et C ++ où il peut se produire. Y at-il un autre endroit où il peut arriver?

Mise à jour: qui est, ce qui ressemble à « passer la valeur » est en fait « passer par référence ». Si elle passe un objet en Java, Perl, PHP, Python et Ruby, il est passe par référence automatiquement et les valeurs des variables d'instance de l'objet peut être modifié. Qu'en est-il dans le passage non-objet?

Était-ce utile?

La solution

Beaucoup d'autres langues Un tel soutien "passent par référence" - Perl, Fortran, Pascal, Visual Basic, ...

Quels sont ceux que vous aimez, eh bien, il est difficile pour nous de dire -)

Edit: Dans votre mise à jour, vous mettez Java et Python dans la même catégorie, mais ce qui ne va pas: on ne pouvait pas reproduire votre exemple avec (Java):

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

ou (python):

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

style de Python et Java est parfois connu sous le nom « par référence d'objet » (par opposition à « par référence variable »): ce qui est passé (ou affecté) est une référence à l'objet (donc si l'objet a muteurs l'appelé peut invoquer ces mutateurs et donc de modifier l'objet), pas à une « variable » (de sorte qu'après l'appel de la variable, le cas échéant, utilisé pour transmettre l'argument, fait toujours référence au même objet, jamais à un autre objet). Cette distinction est le plus évident de voir avec des objets immuables, tels que (dans Java et Python) nombres et les chaînes.

Autres conseils

Vous ne pouvez pas modifier une variable en C ++, sauf si vous explicitement définir comme une référence. Si vous avez des arguments réguliers (non de référence), ils sont des copies et peuvent pas être changé. Si vous lisez et comprenez l'API, alors il n'y a pas besoin d'être attention à passer d'une simple variable de type de données comme arguments de la fonction .

void func(type & arg);

peut être modifié et

void func(type arg);

ne peut pas. Et généralement, en C ++, il ne sera pas un argument de référence à moins que l'API veut est la valeur à modifier en premier lieu (paramètre de sortie).

Et comme Alex a déjà été mentionné il y a beaucoup de langues qui prennent en charge la passer par référence expression.

Vous ne devez être prudent si une langue fait pas clair si une variable est passée par la valeur ou par référence .

De retour dans l'ancien temps, FORTRAN passé constantes par référence. Vous pouvez passer la constante 2 à un sous-programme et le sous-programme pourrait affecter 3 à elle. Puis, après le retour, ce code

x = 2 + 2

fixerait x à 6. Je ne sais pas si les compilateurs Fortran modernes permettent que cela se produise.

Suite à la discussion ci-dessus, récemment, j'appris que l'utilisation de la conception du langage de programmation y du terme « passage par référence » est plutôt très stricte, et par exemple en java est en fait simplement passer par valeur, strictement.

Soit, vous passez une primitive en valeur (claire à tout le monde que je croyais) ou vous passez une référence à un objet en valeur. Ok que je comprends encore maintenant examiner le code Perl suivant.

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";

Ma question si laquelle des trois appels à d'autres addFoo, est considéré comme un passage par référence au lieu de passer-A-référence? Il semble que la réponse est claire pour le numéro trois, mais je ne peux pas dire pour le numéro # 1. # 2. comme le font exactement la même chose. Au moins, le numéro 2 est considéré explicitement comme passage par référence dans certaines pages de manuel perl et de sites Web.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top