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.


  • Mod

    _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.


Anmelden zum Antworten