Default-Parameter

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Default-Parameter

Beitrag von Glocke » So Mär 31, 2013 3:11 pm

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

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Default-Parameter

Beitrag von cloidnerux » So Mär 31, 2013 3:59 pm

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
Redundanz macht wiederholen unnötig.
quod erat expectandum

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Default-Parameter

Beitrag von Glocke » So Mär 31, 2013 4:19 pm

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)?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Default-Parameter

Beitrag von cloidnerux » So Mär 31, 2013 4:25 pm

Nein. Es wird eben über die Position in der Auflistung festgelegt, welchem Parameter du was zuweist, so kenne ich das zumindest.
Redundanz macht wiederholen unnötig.
quod erat expectandum

sebix
Beiträge: 82
Registriert: Mo Nov 19, 2012 8:27 pm

Re: Default-Parameter

Beitrag von sebix » Mo Apr 01, 2013 9:48 am

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!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Default-Parameter

Beitrag von Xin » Mo Apr 01, 2013 9:53 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten