Default Parameter
-
void hallo(int* a, std::string b = "default", int zahl = 8) { ..... } //aufruf der funktion int c hallo(&c, , 10);
ich kannte frueher, dass ich so aufrufen konnte, moment merkert der compiler mit syntaxerror ',', oder irre ich mich da?
-
Das was du meinst, erinnert mich irgendwie an VB Syntax. Da sollte dein Beispiel funktionieren in C und C++ müssen, sobald du einen Parameter nicht angibst, alle rechts folgenden Parameter auch Default Parameter sein...
-
JnZn558 schrieb:
ich kannte frueher, dass ich so aufrufen konnte, moment merkert der compiler mit syntaxerror ',', oder irre ich mich da?
Was immer du auch früher kanntest, es war kein C++. Du kannst immer nur den letzten, die letzten 2 (oder 3, oder 4...) default-Argumente default-belegen lassen, aber nicht die in der Mitte und am Ende wieder was nicht-Defaultiges.
-
Tobias Gerg schrieb:
Das was du meinst, erinnert mich irgendwie an VB Syntax. Da sollte dein Beispiel funktionieren in C und C++ müssen, sobald du einen Parameter nicht angibst, alle rechts folgenden Parameter auch Default Parameter sein...
du hast recht, am anfang hab ich vb gelernt, voll verwechselt, muss aber sagen, boah, C++ wieder mal so gestrikte regeln
-
JnZn558 schrieb:
C++ wieder mal so gestrikte regeln
Aufgrund der Implementierung eines einzelnen Sprachmittels würde ich nicht solche verallgemeinernden Schlüsse ziehen. In C++ hast du grundsätzlich enorm viele Möglichkeiten und Freiheiten. Wohl etwas mehr als in VB.
Es gibt sogar Leute, die C++ kritisieren, weil es zu viele Dinge erlaubt und ermöglicht (auch wenn ein Grossteil davon Trolle sind und sich auf
const_cast
beziehen). Aber das nur nebenbei...
-
Außerdem müssen Default-Werte bei der Deklaration (Prototyp) gesetzt werden und dürfen nicht bei der Definition stehen, wenn ich mich nicht irre.
-
_matze schrieb:
Außerdem müssen Default-Werte bei der Deklaration (Prototyp) gesetzt werden und dürfen nicht bei der Definition stehen, wenn ich mich nicht irre.
nicht ganz. Es ist nicht zulässig, default-Parameter zu wiederholen, allerdings kann man weitere hinzufügen, sofern alle folgenden Parameter ebénfalls ein Defaultargument haben (entweder aus dieser oder einer vorherigen Deklaration der Funktion).
void f(int,int,int); void f(int,int=2;int=3); void f(int=1,int,int);
Praktische bedeutsame Anwendungsfälle sehe ich allerdings keine.
-
camper schrieb:
nicht ganz. Es ist nicht zulässig, default-Parameter zu wiederholen, allerdings kann man weitere hinzufügen, sofern alle folgenden Parameter ebénfalls ein Defaultargument haben (entweder aus dieser oder einer vorherigen Deklaration der Funktion).
void f(int,int,int); void f(int,int=2;int=3); void f(int=1,int,int);
Praktische bedeutsame Anwendungsfälle sehe ich allerdings keine.
Wobei anzumerken ist, dass für den Code die jeweils sichtbaren default-Parameter gelten:
//f.h void f(int, int, int=3); void g(); //f.cpp void f(int, int=2, int) { /* ... */ } void g() { f(10); //f(10, 2, 3) } //a.cpp #include "f.h" void foo() { f(11); //FEHLER, die Deklaration aus f.h hat nur einen def-param f(11, 12); //OK, f(11, 12, 3) } //b.cpp void f(int=1, int=4, int=7); //an Stelle des includes void bar() { f(); //f(1,4,7) }
Beim Linken wird so oder so immer nur das Symbol für f(int,int,int) gesucht, die Default-Parameter sind nur beim compilieren innerhalb der ÜE wichtig.