Differenz des Funktionsarguments als (const int &) und (int & a) in C ++

8

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 !!!) ???

    
Narek 28.04.2010, 07:03
quelle

7 Antworten

10

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.

%Vor%     
David Rodríguez - dribeas 28.04.2010, 07:08
quelle
7
  

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.

    
Alex Budovski 28.04.2010 07:05
quelle
1

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.

    
xtofl 28.04.2010 07:09
quelle
1

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.

    
yesraaj 28.04.2010 07:28
quelle
0

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.

    
Naveen 28.04.2010 07:10
quelle
0

Ich würde das sagen

%Vor% Mit

kann 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'

    
Vicente Botet Escriba 28.04.2010 07:46
quelle
0

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!

    
OlimilOops 28.04.2010 07:55
quelle