Der einzige Grund, den ich denke, ist "weil es verwechselt wird mit dem Übergeben von Referenzen in C ++, C #, PHP usw.".
Java, Python, Ruby, JavaScript (ECMAScript) usw. werden erwähnt, aber in diesem Artikel wird Java hauptsächlich als Vertreter von ihnen verwendet. Dies gilt jedoch auch für andere Sprachen, sodass der Begriff "Referenzübergabe" auch nicht verwendet werden sollte.
Dies ist ein Beispiel für die Übergabe als Referenz in C ++.
#include <iostream>
using namespace std;
void f(int x) {
x = 1;
}
void g(int &x) {
x = 2;
}
int main(void) {
int n = 0;
cout << n << endl; // => 0
f(n);
cout << n << endl; // => 0
g(n);
cout << n << endl; // => 2
}
f
wird als Wert übergeben und g
wird als Referenz übergeben. Bei der Übergabe von Werten hat die Zuweisung zu einem formalen Argument keine Auswirkung auf das tatsächliche Argument. Bei der Übergabe als Referenz wird die Zuweisung zu einem formalen Argument dem tatsächlichen Argument selbst zugewiesen. Als Referenz können formale Argumente auch als Aliase für tatsächliche Argumente betrachtet werden.
Dies liegt daran, dass die Person, der mitgeteilt wurde, dass die Übergabe des Java-Referenztyps "Referenzübergabe" ist, den obigen Code nicht verstehen kann, wenn sie sich C ++ als Referenzübergabe ansieht. Selbst wenn das formale Argument in Java ein Referenztyp ist, kann das tatsächliche Argument nicht durch Zuweisen des formalen Arguments selbst geändert werden. Mit anderen Worten, es ist ein völlig anderes Verhalten als das, was in C ++ als Referenzübergabe bezeichnet wird. Wenn Sie es mit demselben Namen aufrufen, können Sie nicht verstehen, welches das richtige Verhalten ist.
Auch in C ++ wird es als Referenztyp ausgedrückt. Die Bedeutung von "Referenz" unterscheidet sich jedoch vom Java-Referenztyp. Dies liegt daran, dass wenn Sie in C ++ "Referenz" sagen, dies "Referenz auf Variable [^ 1]" bedeutet, wenn Sie in Java "Referenz" sagen, bedeutet dies "Referenz auf (tatsächliches) Objekt" [^ 2]. Es ist wahrscheinlich, dass er das Wort "Pass by Reference" neu erfunden hat, weil er alleine gegangen ist, ohne diesen Unterschied zu verstehen.
Natürlich gibt es Begriffe, die je nach Sprache und Sprachgemeinschaft unterschiedliche Bedeutungen haben, wie beispielsweise den oben genannten "Referenztyp". Um jedoch Missverständnisse zu vermeiden, ist die zugrunde liegende Bedeutung in den meisten Fällen in allen Sprachen gleich und hängt nur von den für diese Sprache spezifischen Umständen ab. Sofern es nicht streng durch Spezifikationen definiert ist, sollte es so weit wie möglich in einem sprachunabhängigen Sinne verwendet werden. Erstens ist das Übergeben eines Referenztyps in Java ein völlig anderes Verhalten als das Übergeben eines Referenztyps in C ++, und es ist schwer zu sagen, dass dies grundsätzlich üblich ist.
Einige mögen sich dennoch fragen, ob beide "als Referenz übergeben werden können", da die Sprachen unterschiedlich sind. In diesem Fall sollten Sie an C # denken. In C # wird der Referenztyp auf die gleiche Weise wie in Java übergeben, es ist jedoch auch möglich, in C ++ als Referenz zu übergeben. Wenn sowohl Java als auch C ++ den Begriff "Referenzübergabe" verwenden, können in C # beide unterschiedlichen Übergabemethoden als "Referenzübergabe" bezeichnet werden. Wenn man jedoch anders aufgerufen wird, muss das gleiche Verhalten je nach Sprache umbenannt werden, was zu weiterer Verwirrung führt und das Verständnis des Verhaltens noch schwieriger macht.
Selbst wenn Sie gut sind, kann die Person, die den Artikel liest, den Sie geschrieben haben, verwirrt sein. Leute, die nichts wissen, werden verwirrt sein, zumindest wenn es keine Notizen gibt. Wenn Sie einen so verwirrenden Artikel schreiben, müssen Sie sagen, dass Sie nicht in der Lage sind, Sätze zu schreiben, die anderen erklären.
Bitte schwören Sie, dass Sie für den Rest Ihres Lebens keine Sprachen wie C ++, C # und PHP verwenden werden. Fügen Sie am Anfang des Artikels, den Sie schreiben, den Satz "Nur Personen vorlesen, die niemals eine andere Sprache mit" Referenzübergabe "in einem anderen Sinne verwenden, z. B. C ++, C #, PHP usw." hinzu. Es wird empfohlen. Auf diese Weise werden weder Sie noch die Person, die Ihren Artikel aufgerufen hat, für immer verwirrt sein.
Das Konzept der Referenzübergabe in C ++ ist alt und geht zumindest auf FORTRAN II zurück. Es ist jedoch nicht bekannt, ob es ab diesem Zeitpunkt als "Referenzübergabe" bezeichnet wurde, aber zumindest als das erste C ++ erstellt wurde, scheint das Wort "Referenzübergabe" verwendet worden zu sein, um es von "Wertübergabe" zu unterscheiden. .. Java wurde mehr als 10 Jahre später erstellt. Wörter sind der Gewinner der ersten Person, die anruft. Es ist schwierig, die Bedeutung eines zuvor existierenden Wortes zu ändern, und es wird schwierig sein, es in einen anderen Namen zu ändern.
Wörter ändern sich jedoch schnell. Wenn Sie also Ihr Bestes tun, um sie aufzuklären, kann sich ihre Bedeutung in etwa 10 Jahren ändern. Ich unterstütze Sie nicht oder stimme Ihnen nicht zu, also geben Sie bitte Ihr Bestes.
Ich nenne es hauptsächlich "Pass by Reference" oder "Pass by Share", bin mir aber nicht sicher, ob das wirklich in Ordnung ist. Ich habe eine Frage zu Teratail gestellt, aber ich habe nicht viele Antworten bekommen. Wenn Sie der Meinung sind, dass Sie es so nennen sollten, beantworten Sie bitte die folgenden Fragen. Natürlich können Sie immer noch sagen, dass Sie es "Referenzübergabe" nennen sollten.
Name der Bewertungsstrategie zum Übergeben (Aufrufen) von Objekten in einer gemeinsam nutzbaren Form
Referenz: Nennen Sie es nicht mehr als Referenz
[^ 1]: Um genau zu sein, ist es ein Verweis auf den Wert. Seit C ++ 11 gibt es auch eine andere "Referenz" namens rvalue reference.
[^ 2]: Java-Referenztypen ähneln C ++ - Zeigertypen. Da nicht die "Referenz", sondern der "Referenzwert" in die Variable eingeht, befindet sich in der Nähe des Zeigers etwas, das der tatsächliche Wert ist. Im Gegensatz dazu bedeutet eine C ++ - "Referenz" nicht, dass eine Variable einen zeigerartigen Wert hat.
Recommended Posts