Jak przekazać opcjonalne argumenty do metody w C ++?

112

Jak przekazać opcjonalne argumenty do metody w C ++? Dowolny fragment kodu ...

Swapnil Gupta
źródło
9
Nie przekazujesz parametrów opcji. Przekazujesz opcjonalne argumenty!
Chubsdad,
Aby uzyskać bardziej jawną kontrolę niż ta zapewniana przez rezerwowanie wartości wartowników, sprawdź Boost :: optional <>.
Tony Delroy

Odpowiedzi:

145

Oto przykład przekazywania trybu jako parametru opcjonalnego

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

możesz zadzwonić do myfunc na oba sposoby i oba są ważne

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1
Pramendra Gupta
źródło
Czy możesz podać jakiś przykład związany ze stringiem?
Swapnil Gupta,
void myfunc (int blah, char mode [] = NULL)
Pramendra Gupta
2
NULLoznacza wskaźnik NULL, mimo że zostałby zdefiniowany jako dosłowny 0. Nie jest to uniwersalna nazwa dla stałego zera. Dla liczb całkowitych (nie-wskaźniki) należy korzystać z numerów: int mode = 0.
UncleBens
1
Jeśli pracujesz z klasą (plikami źródłowymi i nagłówkowymi), gdzie zdefiniowałbyś wartość domyślną?
AceFunk
2
@AceFunk Super późno, ale kod, który widziałem, ma domyślną wartość zdefiniowaną w nagłówku. Jeśli się nad tym zastanowić, system nie wiedziałby, że można pominąć wartość, jeśli opcja została zdefiniowana w źródle
Mars
50

Ważna zasada dotycząca użycia parametrów domyślnych:
Parametry domyślne należy określić na prawym końcu, po określeniu parametru wartości domyślnej nie można ponownie określić parametru innego niż domyślny. dawny:

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

int DoSomething(int x, int z, int y = 10) -----------> Allowed 
Alok Save
źródło
@Chubsdad - Ahh ... moje złe, niejednoznaczne stwierdzenie! czy drugie stwierdzenie podsumowuje to poprawnie? „po określeniu parametru wartości domyślnej nie można ponownie określić parametru innego niż domyślny”
Alok Zapisz
1
Więc jeśli dobrze rozumiem, czy mam wiele parametrów opcjonalnych, powinienem zaimplementować je wszystkie lub w ogóle nie wdrożyć? Nie mogę wybrać jednego opcjonalnego parametru, ale reszty nie?
Gerard
@Gerard: Przykład „Dozwolone” pokazuje jeden opcjonalny parametr, a nie resztę, która jest poprawna.
Alok Save
4
Rozumiem, ale co gdybym miał int foo(int x, int y = 10, int z = 10)i chciałbym zadzwonić foo(1,2), więc podając tylko jeden opcjonalny parametr. Wydawało się, że nie jestem w stanie zmusić go do pracy.
Gerard
30

Dla niektórych może być interesujące, że w przypadku wielu parametrów domyślnych:

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

Biorąc pod uwagę następujące wywołania funkcji:

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

Generowane są następujące dane wyjściowe:

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

Źródła: http://www.learncpp.com/cpp-tutorial/77-default-parameters/

user2008151314
źródło
1
To jest to, czego szukałem. Użyj jednej funkcji, która może obsługiwać różną liczbę argumentów. Zadeklaruj funkcję z wartością domyślną w pliku nagłówkowym, a następnie zdefiniuj ją bez domyślnych parametrów, a następnie możesz jej użyć. Nie ma potrzeby przeciążania funkcji
Teh Sunn Liu
15

Użyj parametrów domyślnych

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 = "" 

}

Uwaga: poniższe elementy są źle sformułowane

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

template <typename T>
void func(T a, T b = a )
Prasoon Saurav
źródło
Dzięki za ogólne rozwiązanie, próbowałem wymyślić, jak podać wartość domyślną dla dowolnego typu.
Anonimowy
13

Aby postępować zgodnie z podanym tutaj przykładem, ale aby wyjaśnić składnię przy użyciu plików nagłówkowych, deklaracja forward funkcji zawiera opcjonalną wartość domyślną parametru.

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
źródło
10

Oddzielają je przecinkami, podobnie jak parametry bez wartości domyślnych.

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
źródło
9

Zwykle przez ustawienie domyślnej wartości parametru:

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 Coffin
źródło
8

Wraz z wprowadzeniem std :: optional w C ++ 17 możesz przekazać opcjonalne argumenty:

#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");
}

Wynik:

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

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

Fernando G. Testa
źródło