Unterschied der Funktion als argument (const int &) und (int & a) in C++
Ich weiß, dass, wenn Sie schreiben void Funktionsname(int& a), dann Funktion wird nicht lokale Kopie der variable als argument übergeben wird. Auch begegnet in der Literatur, die Sie schreiben sollten void function_name(const int & a), um zu sagen, compiler, dass ich nicht wollen, dass die variable als argument übergeben wird, kopiert werden.
Also meine Frage: was ist der Unterschied bei diesen beiden Fällen (außer, dass "const" sorgt dafür, dass die übergebene variable nicht geändert werden, indem die Funktion!!!)???
- Ist es nicht der Unterschied zwischen
const int & a
undint a
oder sogarconst int a
der wirkliche Punkt ? Ich Frage mich, warum der compiler sollte einen Unterschied machen zwischenconst int & a
undconst int a
? Oder hat Sie & garantieren, dass der compiler wird nicht machen Sie eine Kopie undconst int a
zwingen eine Kopie zu erstellen ? Wie können Sie sagen, "lassen Sie den compiler wählen' ? - Siehe auch hier: stackoverflow.com/questions/2139224/2139254#2139254
- Der compiler kann nicht entscheiden. Bedenken Sie, dass Sie deklarieren eine Funktion
void f( <you choose> int x );
. An der Stelle der Deklaration: der compiler hat keine Informationen darüber, ob Sie will oder nicht, ändern Sie das Objekt. Sehen nur den code, der es durchsetzen kann, dass der code nicht ändern oder ändert die parameter. Und selbst dann, wenn sich der code ändert sich ein parameter, wie kann der compiler wissen, ob Sie möchten, dass Veränderungen sichtbar werden, die außerhalb der Funktion? Selbst wenn, könnte es beschließen, mit der definition, wie würde der compiler betrachten Sie die Signatur in der übersetzung Einheiten, wo nur die Kopfzeile enthalten ist? - OK, also es ist eine Verknüpfung problem. Und ich denke, wenn inlining kann der compiler optimieren, die Unterschiede sowieso Weg.
- Es ist eher ein problem der Erkenntnis: der compiler weiß, was Sie sagen, es, nicht, was Sie bedeutete, Sie zu erzählen. Und das ist nicht nur ein problem in der link-Zeit, kann es innerhalb der gleichen übersetzungseinheit: deklarieren Sie die Funktion, verwenden Sie es, und später definieren. Am Punkt der Verwendung der compiler noch nicht gesehen hat, der definition und nicht erraten konnten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie verwenden
const
in der Signatur wenn Sie nicht brauchen, zu schreiben. Hinzufügenconst
um die Unterschrift hat zwei Effekte: es teilt dem compiler mit, dass Sie es wollen, zu überprüfen und zu garantieren, dass Sie nicht ändern, das argument innerhalb der Funktion. Der zweite Effekt ist, dass ermöglicht es externen code verwenden deine Funktion übergeben von Objekten, die sich dauernd (und Provisorien), so dass mehr verwendet von der gleichen Funktion.Zur gleichen Zeit, die
const
keyword ist ein wichtiger Teil der Dokumentation Ihre Funktion/Methode: die Funktion der Signatur ist ausdrücklich zu sagen, was Sie zu tun beabsichtigen, mit dem argument, und ob es sicher ist, übergeben Sie ein Objekt, das Teil eines anderen Objekts Invarianten in Ihre Funktion: Sie werden explizit, dass Sie nicht Durcheinander mit Ihrem Objekt.Mit
const
Kräfte, die einen mehr strenge Reihe von Anforderungen, die in Ihrem code (die Funktion): Sie können das Objekt ändern, aber zur gleichen Zeit ist weniger restriktiv in Ihren Anrufern, so dass Sie Ihren code besser wiederverwendbar.Dass ist den Unterschied.
const
nicht beeinflussen, ob oder nicht eine Kopie durchgeführt wird. Die übergabe per Referenz (const
oder nicht), vermeiden Sie eine Kopie. Als Wert übergeben werden (nicht mit einem Verweis) führt zu einer Kopie, ob der parameterconst
oder nicht. Mit einemconst
Referenz parameter für eineint
wird im Allgemeinen als unnötig erachtet, da als Wert übergeben werden, hat keine zusätzlichen Kosten in diesem Fall.const int
vsint
?int
übergeben werden, kopieren Sie die beiden Zeiten, die ehemalige sicherzustellen, dass die Funktion nicht ändern. (Aber das spielt keine große Rolle für die Anrufer, da es nur ändern können, seine Kopie). Aber dies kann verhindern, dass versehentliche änderung, in der gleichen Weiseconst
wird verwendet bei der Deklaration der lokalen Variablen.Geben Sie hier den Unterschied. Sie können auch formulieren als:
Wenn Sie angeben möchten, dass die Funktion ändern das argument (d.h. für
init_to_big_number( int& i )
durch Angabe des Arguments von (Variablen) verweisen. Wenn Sie Zweifel haben, geben Sie esconst
.Beachten Sie, dass der nutzen nicht kopieren das argument ist in der Leistung, D. H. für 'teuer' - Objekte. Für built-in Typen wie
int
es macht keinen Sinn zu schreibenvoid f( const int& i )
. Die übergabe der Referenz auf die variable, die ist genauso teuer wie die übergabe des Wertes.Gibt es einen großen Unterschied in Bezug auf die parameter, die Sie laufen könnten, auf,
Angenommen, Sie haben ein copy-Konstruktor für Ihre Klasse aus int,
Die const-version kann im wesentlichen arbeiten auf temporäre Werte und die nicht-Konstante version konnte nicht arbeiten auf temporären, Sie würde einfach Gesicht Problem, wenn Sie verpassen const, wo es erforderlich ist, und verwenden Sie STL -, aber Sie bekommen weired Fehlermeldung, es konnte nicht finden, eine version, die dauert nur vorübergehend. Ich empfehle, verwenden Sie const, wo immer Sie können.
Sind Sie für verschiedene Zwecke verwendet. Übergabe von Variablen mit
const int&
gewährleistet die pass-by-copy Semantik mit viel besser Leistung. Sie garantiert, dass die aufgerufene Funktion (es sei denn, es hat einige verrückte Sachen mitconst_cast
) wird sich nicht ändern Ihre übergebene argument, ohne eine Kopie.int&
wird verwendet, wenn im Allgemeinen gibt es mehrere Rückgabewerte aus einer Funktion. In diesem Fall können diese verwendet werden, halten Sie die Ergebnisse der Funktion.const int&
. Externe änderungen an dem übergebenen Objekt sichtbar sein wird innerhalb der aufgerufenen Funktion. Dies ist definitiv nicht eine pass-Kopie semantische, es ist ein feature von pass-by-reference.Ich würde sagen, dass
mir erlaubt, übergeben Sie einen Verweis, um temporäre Objekt wie folgt
Während
fehlschlägt, dies zu erreichen. mit dem folgenden Fehler
error: invalid initialization of non-const reference of type 'X&" aus einem temporären of type 'X'
ohne die performance-Diskussion, lassen Sie uns den code zu sprechen!
Verwendung von "const", wo es benötigt wird, hat die folgenden Vorteile:
* Sie können ändern, die constness einer variable, die ich in verschiedenen Funktionen
in der Funktion wo ich es definiert ist, könnte eine variable
in einer anderen Funktion, könnte es sein, konstanter Wert.
* schon deine IDE weiß, dass ich sollte nicht verändert werden.
und es zwingt dich keiner einen Wert zuweisen ich
Grüße
Oops