Wie übergebe ich optionale Argumente an eine Methode in C ++?

112

Wie übergebe ich optionale Argumente an eine Methode in C ++? Beliebiges Code-Snippet ...

Swapnil Gupta
quelle
9
Sie übergeben keine Optionsparameter. Sie übergeben optionale Argumente!
Chubsdad
Weitere Informationen zur expliziteren Steuerung als durch Reservieren von Sentinel-Werten finden Sie unter boost :: optional <>.
Tony Delroy

Antworten:

145

Hier ist ein Beispiel für den Übergabemodus als optionaler Parameter

void myfunc(int blah, int mode = 0)
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}

Sie können myfunc auf beide Arten aufrufen und beide sind gültig

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1
Pramendra Gupta
quelle
Können Sie uns bitte ein Beispiel für einen String geben?
Swapnil Gupta
void myfunc (int blah, char mode [] = NULL)
Pramendra Gupta
2
NULLbedeutet einen NULL-Zeiger, obwohl er als Literal definiert wäre 0. Es ist kein universeller Name für die Konstante Null. Für Ganzzahlen (Nichtzeiger) sollten Sie Zahlen verwenden : int mode = 0.
UncleBens
1
Wenn Sie mit einer Klasse (Quell- und Header-Dateien) arbeiten, wo würden Sie den Standardwert definieren?
AceFunk
2
@AceFunk Super spät, aber der Code, den ich gesehen habe, hat den im Header definierten Standardwert. Wenn Sie darüber nachdenken, würde das System nicht wissen, dass Sie den Wert weglassen können, wenn das Optionale in der Quelle definiert wurde
Mars
50

Eine wichtige Regel in Bezug auf die Verwendung von Standardparametern:
Standardparameter sollten ganz rechts angegeben werden. Sobald Sie einen Standardwertparameter angegeben haben, können Sie keine Nicht-Standardparameter mehr angeben. Ex:

int DoSomething(int x, int y = 10, int z) -----------> Not Allowed

int DoSomething(int x, int z, int y = 10) -----------> Allowed 
Alok Speichern
quelle
@Chubsdad - Ahh..meine schlechte mehrdeutige Aussage! summiert die zweite Aussage es richtig? "Sobald Sie einen Standardwertparameter angegeben haben, können Sie keinen nicht standardmäßigen Parameter mehr erneut angeben"
Alok Save
1
Wenn ich also richtig verstehe, wenn ich mehrere optionale Parameter habe, sollte ich entweder alle oder gar keine implementieren? Ich kann nicht 1 optionalen Parameter verwenden, aber nicht den Rest?
Gerard
@Gerard: Das Beispiel "Zulässig" zeigt einen optionalen Parameter und nicht den gültigen Restanwendungsfall.
Alok Save
4
Ich verstehe, aber was wäre, wenn ich hätte int foo(int x, int y = 10, int z = 10)und aufrufen möchte foo(1,2), also nur einen optionalen Parameter angeben. Ich schien nicht in der Lage zu sein, es selbst zum Laufen zu bringen.
Gerard
30

Für einige von Ihnen könnte es interessant sein, dass bei mehreren Standardparametern:

void printValues(int x=10, int y=20, int z=30)
{
    std::cout << "Values: " << x << " " << y << " " << z << '\n';
}

Bei folgenden Funktionsaufrufen:

printValues(1, 2, 3);
printValues(1, 2);
printValues(1);
printValues();

Die folgende Ausgabe wird erzeugt:

Values: 1 2 3
Values: 1 2 30
Values: 1 20 30
Values: 10 20 30

Referenz: http://www.learncpp.com/cpp-tutorial/77-default-parameters/

user2008151314
quelle
1
Das habe ich gesucht. Verwenden Sie eine Funktion, die eine unterschiedliche Anzahl von Argumenten verarbeiten kann. Deklarieren Sie die Funktion mit dem Standardwert in der Header-Datei, definieren Sie sie dann ohne Standardparameter und verwenden Sie sie. Keine Notwendigkeit, Funktionsüberlastung zu machen
Sunn Liu
15

Verwenden Sie Standardparameter

template <typename T>
void func(T a, T b = T()) {

   std::cout << a << b;

}

int main()
{
    func(1,4); // a = 1, b = 4
    func(1);   // a = 1, b = 0

    std::string x = "Hello";
    std::string y = "World";

    func(x,y);  // a = "Hello", b ="World"
    func(x);    // a = "Hello", b = "" 

}

Hinweis: Die folgenden sind schlecht geformt

template <typename T>
void func(T a = T(), T b )

template <typename T>
void func(T a, T b = a )
Prasoon Saurav
quelle
Vielen Dank für die allgemeine Lösung. Ich habe versucht herauszufinden, wie ein Standardwert für einen beliebigen Typ bereitgestellt werden kann.
Anonym
13

Um dem hier angegebenen Beispiel zu folgen, aber um die Syntax mithilfe von Header-Dateien zu verdeutlichen, enthält die Funktionsvorwärtsdeklaration den optionalen Parameterstandardwert.

myfile.h

void myfunc(int blah, int mode = 0);

myfile.cpp

void myfunc(int blah, int mode) /* mode = 0 */
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}
KenJ
quelle
10

Mit Kommas, die sie trennen, genau wie Parameter ohne Standardwerte.

int func( int x = 0, int y = 0 );

func(); // doesn't pass optional parameters, defaults are used, x = 0 and y = 0

func(1, 2); // provides optional parameters, x = 1 and y = 2
Ben Voigt
quelle
9

In der Regel durch Festlegen eines Standardwerts für einen Parameter:

int func(int a, int b = -1) { 
    std::cout << "a = " << a;
    if (b != -1)        
        std::cout << ", b = " << b;
    std::cout << "\n";
}

int main() { 
    func(1, 2);  // prints "a=1, b=2\n"
    func(3);     // prints "a=3\n"
    return 0;
}
Jerry Sarg
quelle
6

Mit der Einführung von std :: optional in C ++ 17 können Sie optionale Argumente übergeben:

#include <iostream>
#include <string>
#include <optional>

void myfunc(const std::string& id, const std::optional<std::string>& param = std::nullopt)
{
    std::cout << "id=" << id << ", param=";

    if (param)
        std::cout << *param << std::endl;
    else
        std::cout << "<parameter not set>" << std::endl;
}

int main() 
{
    myfunc("first");
    myfunc("second" , "something");
}

Ausgabe:

id=first param=<parameter not set>
id=second param=something

Siehe https://en.cppreference.com/w/cpp/utility/optional

Fernando G. Testa
quelle