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 und int a oder sogar const int a der wirkliche Punkt ? Ich Frage mich, warum der compiler sollte einen Unterschied machen zwischen const int & a und const int a ? Oder hat Sie & garantieren, dass der compiler wird nicht machen Sie eine Kopie und const 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.
InformationsquelleAutor Narek | 2010-04-28
Schreibe einen Kommentar