Hallo Herr Mahr. Vielen Dank für die gut gemachten Videos. Sie erleichtern wirklich das lernen von CPP. Zu dem vorliegenden Video hätte ich folgende Frage: Sie sagen gegen Ende des Videos (ca. 14:30) dass sich überladene Funktionen nicht nur durch die Angabe "const" unterscheiden dürfen. Aber am Anfang des Videos (ca. 4:30) werden zwei Funktionen gezeigt, die sich nur durch "const" unterscheiden. Wo ist hier der Trick? Viele Grüße Uwe Rei
Freut mich, dass die Videos helfen. Zur Frage: Warum liefert Programm 1 einen Fehler und Programm nicht? Programm 1: void f(int) {} void f(const int) {} int main() {} Programm 2: void f(int&) {} void f(const int&) {} int main() {} Kurz: Eine Überladung ist immer verboten, wenn die einzige Unterscheidung in der Konstanz der Funktionsargumente liegt. In Programm 1 bezieht sich const auf dieses Argument, aber in Programm 2 bezieht sich const auf die Ganzzahl, die referenziert wird. Lang: Programm 1 liefert einen Fehler, weil beiden Funktionen eine Überladung darstellen, bei der die einzige Unterscheidung in der Konstanz des Arguments liegt, und C++ keine Überladung allein aufgrund der Konstanz von Argumenten zulässt. Egal ob ein konstanter oder nichtkonstanter Wert an f übergeben wird, es wird immer eine Kopie angelegt. Egal ob der Originalwert konstant ist oder nicht, man könnte ihn prinzipiell sowohl an f(const int) als auch an f(int) übergeben. Das const in f(const int) legt lediglich fest, dass die Kopie in f nicht verändert werden kann. In Programm 2 stellen die beiden Funktionen f eine gültige Überladung dar, da die Unterscheidung aufgrund der Referenzqualifizierung der Parameter erfolgt. f operiert jetzt auf dem Originalwert und hier ist es entscheidend, ob das Original in f verändert werden kann. Daher legt C++ fest, dass eine Konstante nur an f(const) übergeben werden kann, und eine Variable an f(int) und f(const int), und falls beide vorhanden sind, bevorzugt an f(const int).
Also nix zu kritisieren, aber man oh man, Überladen von Funktionen kann man auch vorher an einem ganz kleinen Beispiel zeigen, weil man das sehr oft braucht, und dann das Bindungsverhalten erklären. Aber erwähnt worden ist wirklich alles.
Sehr gut erklärt. Gefällt mir ausgezeichnet!
Vielen Dank!
Hallo Herr Mahr.
Vielen Dank für die gut gemachten Videos. Sie erleichtern wirklich das lernen von CPP.
Zu dem vorliegenden Video hätte ich folgende Frage: Sie sagen gegen Ende des Videos (ca. 14:30) dass sich überladene Funktionen nicht nur durch die Angabe "const" unterscheiden dürfen. Aber am Anfang des Videos (ca. 4:30) werden zwei Funktionen gezeigt, die sich nur durch "const" unterscheiden.
Wo ist hier der Trick?
Viele Grüße
Uwe Rei
Freut mich, dass die Videos helfen.
Zur Frage: Warum liefert Programm 1 einen Fehler und Programm nicht?
Programm 1:
void f(int) {}
void f(const int) {}
int main() {}
Programm 2:
void f(int&) {}
void f(const int&) {}
int main() {}
Kurz: Eine Überladung ist immer verboten, wenn die einzige Unterscheidung in der Konstanz der Funktionsargumente liegt. In Programm 1 bezieht sich const auf dieses Argument, aber in Programm 2 bezieht sich const auf die Ganzzahl, die referenziert wird.
Lang:
Programm 1 liefert einen Fehler, weil beiden Funktionen eine Überladung darstellen, bei der die einzige Unterscheidung in der Konstanz des Arguments liegt, und C++ keine Überladung allein aufgrund der Konstanz von Argumenten zulässt. Egal ob ein konstanter oder nichtkonstanter Wert an f übergeben wird, es wird immer eine Kopie angelegt. Egal ob der Originalwert konstant ist oder nicht, man könnte ihn prinzipiell sowohl an f(const int) als auch an f(int) übergeben. Das const in f(const int) legt lediglich fest, dass die Kopie in f nicht verändert werden kann.
In Programm 2 stellen die beiden Funktionen f eine gültige Überladung dar, da die Unterscheidung aufgrund der Referenzqualifizierung der Parameter erfolgt. f operiert jetzt auf dem Originalwert und hier ist es entscheidend, ob das Original in f verändert werden kann. Daher legt C++ fest, dass eine Konstante nur an f(const) übergeben werden kann, und eine Variable an f(int) und f(const int), und falls beide vorhanden sind, bevorzugt an f(const int).
Also nix zu kritisieren, aber man oh man, Überladen von Funktionen kann man auch vorher an einem ganz kleinen Beispiel zeigen, weil man das sehr oft braucht, und dann das Bindungsverhalten erklären. Aber erwähnt worden ist wirklich alles.
Die Details zum Überladen kommen in Video 21.
2. Runde