PHP ist und C ++ die nur 2 Plätze, die wir müssen vorsichtig über das, was aussieht wie Pass-by-Wert wird in der Tat Pass-by-Referenz?

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

Frage

ist PHP und C ++ die nur 2 Plätze, die wir müssen vorsichtig über einen einfachen Datentyp Variable als Funktion Argument übergeben und der Wert kann geändert werden?

wie

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

und die dritte Zeile, echo $ count Display etwas anderes als 2. Ich weiß nur von PHP und C ++, wo es passieren kann. Gibt es einen anderen Ort, wo es passieren kann?

Update: das ist, was wie "nach Wert übergibt" aussieht, ist in der Tat "pass by reference". Wenn es ein Objekt in Java, Perl, PHP, Python vorbei und Ruby, wird es automatisch Pass-by-reference und die Instanzvariablen Werte des Objekts geändert werden können. Was ist in nicht-Objekt übergeben?

War es hilfreich?

Lösung

Viele andere Sprachen unterstützen solche "als Verweis übergeben" - Perl, Fortran, Pascal, Visual Basic, ...

, welche Sie kümmern uns um, na ja, es ist schwer für uns zu sagen! -)

Edit: In Ihrem Update, setzen Sie Java und Python in der gleichen Kategorie, aber das ist falsch: Sie Ihr Beispiel nicht reproduzieren konnte mit (Java):

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

oder (Python):

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

Python und Java Stil manchmal als „durch Objektreferenz“ bekannt ist (als „durch variable Referenz“ zu entgegengesetzt): was (oder zugeordnet) übergeben wird eine Referenz auf das Objekt (so, wenn das Objekt Mutatoren hat der Angerufene aufrufen Mutatoren diese und damit das Objekt) ändern, um nicht zu einem „variable“ (so dass die Variable nach dem Anruf, falls vorhanden, verwendet, um das Argument übergeben wird, bezieht sich immer noch auf das gleiche Objekt, nie zu einem anderen Objekt). Diese Unterscheidung ist am deutlichsten mit unveränderlichen Objekten zu sehen, wie (in Java und Python) Zahlen und Strings.

Andere Tipps

Sie können eine Variable in C ++ ändern, wenn Sie auf explizit definieren es als Referenz. Wenn Sie regelmäßig (nicht reference) Argumente haben, sind sie Kopien und nicht geändert werden. Wenn Sie die API gelesen und verstanden hat, dann gibt es keine Notwendigkeit, vorsichtig über einen einfachen Datentyp Variable als Funktion Argumente zu übergeben .

void func(type & arg);

kann geändert und werden

void func(type arg);

nicht. Und in der Regel in C ++ wird es kein Referenz Argument sein, wenn die API der Wert wollen ist in erster Linie (Ausgangsparameter) geändert werden.

Und wie Alex bereits erwähnt, gibt es viele Sprachen, die das vorbei Referenz unterstützen Idiom.

Sie müßten nur vorsichtig sein, wenn eine Sprache, es macht nicht klar , wenn eine Variable übergeben wird nach Wert oder durch Verweis .

Zurück in den alten Tagen, bestand Fortran Konstanten Bezug genommen wird. Sie konnten die Konstante 2 zu einem Unterprogramm übergeben und das Unterprogramm 3 zuweisen könnte. Dann, nach der Rückkehr dieser Code

x = 2 + 2

x auf 6 gesetzt wurde ich weiß nicht, ob moderne Fortran-Compiler ermöglichen, dass das passiert.

Nach der obigen Diskussion, die vor kurzem habe ich gelernt, dass y Programmiersprache Design Verwendung des Begriffs „pass-by-reference“ bin eher sehr streng, und zum Beispiel in Java ist in der Tat nur Pass-by-Wert, streng.

Entweder, übergeben Sie einen primitiven nach Wert (jedem klar, ich soll) oder Sie übergeben einen Verweis auf ein Objekt nach Wert. Ok, ich verstehe jetzt noch den folgenden Perl-Code in Betracht ziehen.

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

Meine Frage, ob die aus drei alternativen Anrufen addFoo wird Pass-by-Referenz betrachtet im Gegensatz zu Pass-A-Referenz? Es scheint, dass die Antwort für die Nummer drei ist klar, aber ich kann nicht für Nummer # 1 sagen. # 2. wie tun genau das gleiche. Zumindest ist die Nummer 2 ausdrücklich als Pass-by-reference in einigen Perl-man-Seiten und Web-Seiten betrachtet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top