Seite 1 von 1
Default-Parameter
Verfasst: So Mär 31, 2013 3:11 pm
von Glocke
Hi, aus anderen Sprachen (z.B. Python) kenne ich die Möglichkeit, bestimmten Funktions-Parametern (die einen Defaultwert besitzen) beim Aufruf der Funktion explizit einen Wert zu geben, ohne die Werte der (in der Parameterliste davor stehenden) anderen Parameter explizit zu belegen. Leider finde ich in C++ keine Möglichkeit für sowas. Kann ich davon ausgehen, dass es nicht geht?
Ich meine z.B. so etwas:
Code: Alles auswählen
#include <iostream>
void foo(int a=0, int b=5, const std::string s="", i=7) {
std::cout << "a: " << a << "\tb: " << b
<< "\ts: " << s << "\ti:" << i << std::endl;
}
int main() {
foo();
foo(1, 2);
foo(s="Test");
foo(3, i=-3);
}
Wie ich erwartet hatte, akzeptiert der Compiler (gcc) das nicht (er kennt die Bezeichnet s und i in int main() verständlicherweise nicht).
LG Glocke
Re: Default-Parameter
Verfasst: So Mär 31, 2013 3:59 pm
von cloidnerux
Du kannst Default-Werte angeben.
Die Parameter sind aber weiterhin über ihre Position in der Auflistung definiert. Man kann aber vorbelegte Parameter weglassen, sofern sie am Ende stehen:
Code: Alles auswählen
void foo(int a, int b, int c = 5, int d = 3);
...
foo(1, 2); //c = 5, d = 3
foo(1, 2, 3); //c = 3, d = 3
foo(1, 2, 3, 4); // c= 3, d=4
Re: Default-Parameter
Verfasst: So Mär 31, 2013 4:19 pm
von Glocke
cloidnerux hat geschrieben:Du kannst Default-Werte angeben.
Die Parameter sind aber weiterhin über ihre Position in der Auflistung definiert. Man kann aber vorbelegte Parameter weglassen, sofern sie am Ende stehen:
Code: Alles auswählen
void foo(int a, int b, int c = 5, int d = 3);
...
foo(1, 2); //c = 5, d = 3
foo(1, 2, 3); //c = 3, d = 3
foo(1, 2, 3, 4); // c= 3, d=4
Soweit war mir das bekannt

Also kann ich nicht a und b weglassen, wenn ich c explizit einen Wert geben will und a und b aber ihre Default-Werte bekommen sollen (ohne dass ich auch diese Werte nochmal explizit angebe)?
Re: Default-Parameter
Verfasst: So Mär 31, 2013 4:25 pm
von cloidnerux
Nein. Es wird eben über die Position in der Auflistung festgelegt, welchem Parameter du was zuweist, so kenne ich das zumindest.
Re: Default-Parameter
Verfasst: Mo Apr 01, 2013 9:48 am
von sebix
Als Ergänzung und zur Vollständigkeit eine Hinweis zum Überladen von Funktionen in C++:
C/C++ von Galileo Computing von Ulrich Kaiser und Christoph Kecher hat geschrieben:
Verschiedene Funktionen gleichen Namnes stellen in C++ kein Problem dar, sofern sie anhand ihrer Parametersignatur, d.h. durch Typ und/oder Anzahl ihrer Parameter, unterschieden werden können.
Achtung: In die Parametersignatur gehen weder der Returntyp noch die Default-Argumente einer Funktion ein!
Re: Default-Parameter
Verfasst: Mo Apr 01, 2013 9:53 am
von Xin
sebix hat geschrieben:Als Ergänzung und zur Vollständigkeit eine Hinweis zum Überladen von Funktionen in C++:
C/C++ von Galileo Computing von Ulrich Kaiser und Christoph Kecher hat geschrieben:
Verschiedene Funktionen gleichen Namnes stellen in C++ kein Problem dar, sofern sie anhand ihrer Parametersignatur, d.h. durch Typ und/oder Anzahl ihrer Parameter, unterschieden werden können.
Achtung: In die Parametersignatur gehen weder der Returntyp noch die Default-Argumente einer Funktion ein!
Dazu kann ich auch nur raten. Default-Parameter bedeuten, dass Objekte eventuell erstellt und kopiert werden müssen, oftmals sind bei Defaults allerdings Optimierungen möglich. Setzt man einen Zeiger per Default auf NULL, so muss man fragen, ob der Zeiger NULL ist. Bei einer Überladung, die den Default-Parameter grundsätzlich weglässt, gibt es keinen Zeiger, also auch keine Frage.
Die Überladung macht mehr Tipparbeit, wer mehr Code produziert, riskiert mehr Fehler. Es sollten also auch nur Funktionen existieren, die möglichst häufig gerufen werden. Man sollte keine größere Anzahl von Überladungen für Primitive schreiben, bzw. Typen, die laufend im Einsatz sind. Die Überladungen sollten sich deutlich unterscheiden.