¿Cómo pasar argumentos opcionales a un método en C ++?


112

¿Cómo pasar argumentos opcionales a un método en C ++? Cualquier fragmento de código ...


9
No pasa parámetros de opción. ¡Pasas argumentos opcionales!
Chubsdad

Para un control más explícito que el proporcionado al reservar valores centinela, consulte boost :: optional <>.
Tony Delroy

Respuestas:


145

Aquí hay un ejemplo de modo de paso como parámetro opcional

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

puedes llamar a myfunc de ambas formas y ambas son válidas

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1

¿Puede proporcionar algún ejemplo relacionado con la cadena?
Swapnil Gupta

void myfunc (int blah, char mode [] = NULL)
Pramendra Gupta

2
NULLsignifica un puntero NULL, aunque se definiría como literal 0. No es un nombre universal para cero constante. Para enteros (no punteros) podría utilizar números: int mode = 0.
UncleBens

1
Si está trabajando con una clase (archivos fuente y de encabezado), ¿dónde definiría el valor predeterminado?
AceFunk

2
@AceFunk Muy tarde, pero el código que he visto tiene el valor predeterminado definido en el encabezado. Si lo piensa, el sistema no sabría que puede omitir el valor si el opcional se definió en la fuente
Marte

50

Una regla importante con respecto al uso de parámetros predeterminados: los
parámetros predeterminados deben especificarse en el extremo derecho, una vez que especifica un parámetro de valor predeterminado, no puede especificar un parámetro no predeterminado nuevamente. ex:

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

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

@Chubsdad - ¡Ahh ... mi declaración ambigua! ¿La segunda afirmación lo resume correctamente? "una vez que especifica un parámetro de valor predeterminado, no puede especificar un parámetro no predeterminado de nuevo"
Alok Save

1
Entonces, si entiendo correctamente si tengo varios parámetros opcionales, ¿debería implementarlos todos o ninguno en absoluto? ¿No puedo elegir usar 1 parámetro opcional pero no el resto?
Gerard

@Gerard: El ejemplo "Permitido" muestra un parámetro opcional y no el resto del caso de uso que es válido.
Alok Save

4
Entiendo, pero ¿qué int foo(int x, int y = 10, int z = 10)pasaría si tuviera y quisiera llamar foo(1,2), por lo que solo da un parámetro opcional? No parecía ser capaz de hacerlo funcionar yo mismo.
Gerard

30

Puede ser interesante para algunos de ustedes que en caso de múltiples parámetros predeterminados:

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

Dadas las siguientes llamadas a funciones:

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

Se produce el siguiente resultado:

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

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


1
Esto es lo que estaba buscando. Use una función que pueda manejar diferentes números de argumentos. Declare la función con el valor predeterminado en el archivo de encabezado, luego defínalo sin los parámetros predeterminados y luego puede usarlo. No es necesario hacer una sobrecarga de funciones
Teh Sunn Liu

15

Usar parámetros predeterminados

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

}

Nota: Los siguientes están mal formados

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

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

Gracias por la solución general, estaba tratando de averiguar cómo proporcionar un valor predeterminado para cualquier tipo arbitrario.
Anónimo

13

Para seguir el ejemplo dado aquí, pero para aclarar la sintaxis con el uso de archivos de encabezado, la declaración de avance de la función contiene el valor predeterminado del parámetro opcional.

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

Con comas separándolos, como parámetros sin valores predeterminados.

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

Por lo general, estableciendo un valor predeterminado para un parámetro:

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

8

Con la introducción de std :: Optional en C ++ 17, puede pasar argumentos opcionales:

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

Salida:

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.