Sie sollten const
in der Signatur verwenden, wenn Sie nicht schreiben müssen. Das Hinzufügen von const
zu der 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, was Sie mit dem Argument vorhaben und ob es sicher ist, ein Objekt zu übergeben ist Teil der Invarianten eines anderen Objekts in Ihre Funktion: Sie sind explizit darin, dass Sie sich nicht mit ihrem Objekt anlegen.
Die Verwendung von const
erzwingt eine strengere Reihe von Anforderungen in Ihrem Code (die Funktion): Sie können das Objekt nicht ändern, aber gleichzeitig weniger restriktiv in Ihren Aufrufern, wodurch Ihr Code wiederverwendbar wird.
void printr(int & i) { std::cout << i << std::endl; }
void printcr(const int & i) { std::cout << i << std::endl; }
int main() {
int x = 10;
const int y = 15;
printr(x);
//printr(y); // passing y as non-const reference discards qualifiers
//printr(5); // cannot bind a non-const reference to a temporary
printcr(x); printcr(y); printcr(5); // all valid
}
Ist es nicht der Unterschied zwischen 'const int & a' und' int a' oder sogar 'const int a' der eigentliche Punkt? Ich frage mich, warum der Compiler zwischen const int & a und const int a unterscheiden sollte? Oder wird mit der Garantie, dass der Compiler keine Kopie macht und "const int a" eine Kopie macht? Wie kannst du sagen "den Compiler wählen lassen"? – kriss
Siehe auch hier: http://StackOverflow.com/Questions/2139224/2139254#2139254 – sbi
@Kriss: Der Compiler kann nicht wählen. Beachten Sie, dass Sie eine Funktion 'void f ( int x);'. Zum Zeitpunkt der Deklaration hat der Compiler keine Informationen darüber, ob Sie das Objekt ändern werden oder nicht. Wenn Sie nur den Code sehen, kann er bestätigen, dass sich der Code nicht ändert oder den Parameter ändert. Und selbst dann, wenn der Code einen Parameter ändert, wie kann der Compiler wissen, ob diese Änderung außerhalb der Funktion sichtbar sein soll? Selbst wenn es mit der Definition entscheiden könnte, wie würde der Compiler die Signatur in Übersetzungseinheiten berücksichtigen, in denen nur der Header enthalten ist? –