Konstante Referenzen
Referenzen sind auch nützlich, wenn eine Funktion den Vektor gar nicht ändert. Bei der Übergabe als Wert wird der ganze Vektor mit allen Elementen kopiert. Bei fünf Zahlen spielt das keine Rolle, aber bei einem Vektor mit einer Million Messwerten würde das Programm bei jedem Aufruf der Funktion eine Million Zahlen kopieren. Eine Referenz wird nicht kopiert, ihre Übergabe ist also schnell, egal wie groß der Vektor ist.
Aber eine einfache Referenz hat einen Nachteil: Die Funktion könnte den Vektor ändern, sogar aus Versehen. Und wer int summe(std::vector<int>& zahlen) liest, denkt, dass die Funktion den Vektor ändert. Deshalb schreibst du das Wort const vor den Typ.
const (kurz für „konstant“, englisch constant) bedeutet, dass sich der Wert nicht ändern darf. Du kannst es auch bei einer gewöhnlichen Variablen verwenden, wenn sich ihr Wert im Programm nie ändern soll:
#include <iostream>
int main() {
const int runden = 3;
runden = 4;
return 0;
}Dieses Programm lässt sich nicht kompilieren:
main.cpp:5:12: error: cannot assign to variable 'runden' with const-qualified type 'const int'Der Compiler stellt sicher, dass niemand einer const-Variablen etwas zuweist.
Eine konstante Referenz (englisch const reference) verbindet beides: Die Funktion bekommt den Vektor ohne Kopie, und sie kann ihn nicht ändern:
#include <iostream>
#include <vector>
int summe(const std::vector<int>& zahlen) {
int ergebnis = 0;
for (int zahl : zahlen) {
ergebnis = ergebnis + zahl;
}
return ergebnis;
}
int main() {
std::vector<int> einkaeufe = {120, 45, 80};
std::cout << "Summe: " << summe(einkaeufe) << std::endl;
return 0;
}Das gibt aus:
Summe: 245Lies den Parameter const std::vector<int>& zahlen als „zahlen ist eine Referenz auf einen Vektor aus ganzen Zahlen, der sich nicht ändern darf“. Der Vektor einkaeufe in main ist nicht const: Das const eines Parameters gilt nur innerhalb der Funktion. Würde die Funktion versuchen, den Vektor zu ändern, zum Beispiel mit zahlen[0] = 0;, endete das Kompilieren mit dem Fehler cannot assign to return value because function 'operator[]' returns a const value. Bei zahlen.push_back(5); lautet der Fehler no matching member function for call to 'push_back'.
Welche Art von Parameter solltest du also wählen?
- Kleine Werte, die die Funktion nur liest (
int,double,char,bool): Übergib sie als Wert,int anzahl. Eine einzelne Zahl zu kopieren ist so schnell wie das Übergeben einer Referenz. - Vektoren und Text, die die Funktion nur liest: Übergib sie als konstante Referenz,
const std::vector<int>& zahlen,const std::string& name. Eine solche Funktion kannst du auch mit einem Wert aufrufen, der in keiner Variablen steckt: zum Beispiel die Funktionvoid begruesse(const std::string& name)mit Text in Anführungszeichen,begruesse("Eva"). - Alles, was die Funktion ändern soll: Übergib es als Referenz ohne
const,int& punktestand,std::vector<int>& ergebnisse.
So schreibst du es:
Anweisungen
- 1
Der Vektor
schritteenthält die Zahl der Schritte für jeden Tag. Die Funktiongesamtliest den Vektor nur, bekommt aber trotzdem eine Kopie davon. Ändere ihren Parameter in eine konstante Referenz. Das Programm gibt weiterhinSchritte gesamt: 38100aus. - 2
Schreibe unter der Funktion
gesamteine Funktionmeiste, die den Vektor ebenfalls als konstante Referenz bekommt und sein größtes Element zurückgibt. Gib inmainunter der ersten Ausgabezeile den TextMeiste an einem Tag:und das Ergebnis vonmeiste(schritte)aus. Das Programm gibtSchritte gesamt: 38100und dannMeiste an einem Tag: 12000aus.