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


112

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


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

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 

@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/


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 )

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();
}

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

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;
}

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.