Ich weiß, wenn Sie void function_name (int & amp; a) schreiben, dann wird die Funktion keine lokale Kopie Ihrer als Argument übergebenen Variable ausführen. Auch in der Literatur haben Sie festgestellt, dass Sie void function_name (const int & amp; a) schreiben sollten, um Compiler zu sagen, dass ich nicht möchte, dass die Variable als Argument kopiert wird.
Also meine Frage: Was ist der Unterschied zu diesen beiden Fällen (außer dass "const" dafür sorgt, dass die übergebene Variable nicht durch Funktion verändert wird !!!) ???
Sie sollten const
in der Signatur verwenden, wenn Sie nicht schreiben müssen. Das Hinzufügen von const
zur Signatur hat zwei Auswirkungen: Es teilt dem Compiler mit, dass es überprüft werden soll und garantiert, dass Sie dieses Argument in Ihrer Funktion nicht ändern. Der zweite Effekt besteht darin, dass externer Code Ihre Funktion verwenden kann, indem Objekte übergeben werden, die selbst konstant sind (und Provisorien), wodurch mehr Nutzungen der gleichen Funktion ermöglicht werden.
Gleichzeitig ist das Schlüsselwort const
ein wichtiger Teil der Dokumentation Ihrer Funktion / Methode: Die Funktionssignatur sagt explizit aus, was Sie mit dem Argument machen wollen und ob es sicher ist, ein Objekt zu übergeben das ist ein Teil der Invarianten eines anderen Objekts in deine Funktion: du bist explizit darin, dass du nicht mit ihrem Objekt herumhantierst.
Die Verwendung von const
erzwingt einen strengeren Satz von Anforderungen in Ihrem Code (der Funktion): Sie können das Objekt nicht modifizieren, aber gleichzeitig sind Ihre Aufrufe weniger restriktiv, was Ihren Code wiederverwendbar macht.
Also meine Frage: Was ist der Unterschied? mit diesen zwei Fällen ( außer dass "const" stellt fest, dass die Variable Pässe werden nicht durch geändert Funktion !!!) ???
Das ist der Unterschied.
Sie geben den Unterschied richtig an. Sie können es auch formulieren als:
Wenn Sie angeben möchten, dass die Funktion das Argument ändern (zB für init_to_big_number( int& i )
, indem Sie das Argument nach (Variablen-) Referenz angeben, geben Sie im Zweifelsfall const
an.
Beachten Sie, dass der Vorteil, das Argument nicht zu kopieren, in der Leistung liegt, d. h. für "teure" Objekte. Für eingebaute Typen wie int
macht es keinen Sinn, void f( const int& i )
zu schreiben. Die Übergabe der Referenz an die Variable ist genauso teuer wie die Übergabe des Wertes.
Es gibt einen großen Unterschied hinsichtlich der Parameter, auf denen sie arbeiten könnten, Angenommen, Sie haben einen Kopierkonstruktor für Ihre Klasse von int,
%Vor%Die const-Version kann im Wesentlichen mit temporären Werten arbeiten und die nicht-konstante Version könnte nicht temporär funktionieren. Sie würden leicht Probleme bekommen, wenn Sie const nicht benötigen und STL verwenden, aber Sie bekommen einen Fehler, der Ihnen sagt, dass er nicht gefunden werden kann die Version, die vorübergehend dauert. Ich empfehle const, wo immer Sie können.
Sie werden für verschiedene Zwecke verwendet. Wenn Sie eine Variable mit const int&
übergeben, wird sichergestellt, dass Sie die Semantik "Pass-by-Copy" mit einer viel besseren Leistung erhalten. Sie sind garantiert, dass die aufgerufene Funktion (außer es macht einige verrückte Dinge mit const_cast
) Ihr übergebenes Argument nicht ändert, ohne eine Kopie zu erstellen. int&
wird verwendet, wenn es in der Regel mehrere Rückgabewerte von einer Funktion gibt. In diesem Fall können diese verwendet werden, um die Ergebnisse der Funktion zu halten.
Ich würde das sagen
%Vor% Mitkann ich einen Verweis auf ein temporäres Objekt wie folgt übergeben
%Vor%Während
%Vor%erreicht dies nicht. mit dem folgenden Fehler Fehler: ungültige Initialisierung der nichtkonstanten Referenz vom Typ 'X & amp;' von einem temporären Typ 'X'
Lassen Sie die Leistungsdiskussion aus, lassen Sie den Code sprechen!
%Vor%mit "const", wo es benötigt wird, hat die folgenden Vorteile: * Sie können die Konstanz einer Variablen i in verschiedenen Funktionen ändern in der Funktion, wo ich definiert ist, könnte es eine Variable sein in einer anderen Funktion könnte es ein konstanter Wert sein. * Ihre IDE weiß bereits, dass ich nicht geändert werden sollte. und es zwingt Sie, keinen Wert zu i zuzuweisen
Grüße Hoppla!
Tags und Links c++ reference function argument-passing