2 Stimmen

Zwei Möglichkeiten der Übergabe durch Referenz in C++?

Mögliches Duplikat: Was sind die Unterschiede zwischen Zeigervariablen und Referenzvariablen in C++? Wie übergibt man Objekte an Funktionen in C++?

Ich lerne gerade etwas über Referenzparameter und habe folgende Frage:

Was ist der Unterschied zwischen:

void B(int* worthRef) {
    *worthRef += 1;
}

int main() {
    int netWorth = 55;
    B(&netWorth);
    return 0;
}

Und dies:

void B(int &worthRef) {
    worthRef += 1;
}

int main() {
    int netWorth = 55;
    B(netWorth);
    return 0;
}

5voto

Kerrek SB Punkte 445528

Die erste ( int * ) übergibt einen Zeiger-auf-Ganzzahl als Wert; die zweite ( int & ) übergibt eine Ganzzahl als Referenz. Beide Methoden können verwendet werden, um eine abstrakte "Referenzsemantik" zu implementieren, aber in C++ sollten Sie, wenn möglich, echte Referenzen verwenden.

Wenn Sie Zeiger verwenden, um Referenzsemantik zu implementieren, übergeben Sie als Wert eine Zeiger auf das Objekt, auf das Sie verweisen wollen, und Sie Dereferenzierung den Zeiger, um den tatsächlichen Objektverweis zu erhalten. In C, wo es keine Referenzen in der Sprache gibt, ist das die einzige Möglichkeit, Referenzsemantik zu implementieren, aber in C++ gibt es zu diesem Zweck echte Referenztypen in der Sprache.

Beachten Sie, dass die Übergabe eines Zeigers etwas anders verwendet werden kann als eine Referenz, da Sie einen Null-Zeiger übergeben können, um zusätzliche Semantik zu vermitteln, und Sie können auch die Zeigervariable modifizieren (z. B. für die Verwendung der lokalen Kopie des Zeigers im Bereich des Aufrufenden, um ein Array zu durchlaufen).

Aber um es kurz zu machen: Verwenden Sie Referenzen. Verwenden Sie in C++ keine nackten Zeiger. (Um Referenzsemantik zu implementieren, verwenden Sie Referenzen, und um alles andere zu implementieren, wofür nackte Zeiger (miss)gebraucht werden können, verwenden Sie das entsprechende Idiom auf höherer Ebene). Das grundlegende Problem mit nackten Zeigern ist, dass sie keine Eigentum Semantik, und C++ verfügt über weitaus bessere Werkzeuge zum Schreiben von wartbarem, lokalem und selbstdokumentierendem Code.

1voto

justin Punkte 103032

Hier wird die Adresse des int übergeben:

void B(int* worthRef) {
    *worthRef += 1;
}

Der Parameter ist ein Zeiger. Die übergebene Adresse kann sein 0 (oder NULL ). Wird auch in C verwendet. Der Zeiger kann sich innerhalb von B : ++worthRef - warum Sie das vorziehen würden...

Hier übernimmt die Implementierung die Adresse des Parameters:

void B(int &worthRef) {
    worthRef += 1;
}

Der Parameter ist eine C++-Referenz. Die übergebene Adresse darf nicht 0 und darf nicht verändert werden (natürlich kann das, worauf es sich bezieht, verändert werden, wenn es nicht konstant ist, wie in Ihrem Beispiel zu sehen). Dies ist der Standard-Schreibstil in Die meisten C++ Kreise. Mechanisch gesehen ist eine Referenz ein bisschen syntaktischer Zucker, aber sie ist absolut nützlich, um die Absicht zu vermitteln und Garantien zu bieten.

Aus stilistischen Gründen bevorzugen einige Leute die erste Variante für Parameter, die sich ändern können. Ich verwende Letzteres, wo immer möglich (und legal) - es ist konventioneller für C++.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X