C++ ¿Qué es la sobrecarga de funciones?


Ejemplo

La sobrecarga de funciones es tener múltiples funciones declaradas en el mismo ámbito con el mismo nombre exacto en el mismo lugar (conocido como alcance ) que difiere solo en su firma , es decir, los argumentos que aceptan.

Supongamos que está escribiendo una serie de funciones para las capacidades de impresión generalizadas, comenzando con std::string :

void print(const std::string &str)
{
    std::cout << "This is a string: " << str << std::endl;
}

Esto funciona bien, pero suponga que quiere una función que también acepte un int y que también lo imprima. Podrías escribir:

void print_int(int num)
{
    std::cout << "This is an int:  " << num << std::endl;
}

Pero debido a que las dos funciones aceptan diferentes parámetros, simplemente puede escribir:

void print(int num)
{
    std::cout << "This is an int: " << num << std::endl;
}

Ahora tiene 2 funciones, ambas con nombre de print , pero con firmas diferentes. Uno acepta std::string , el otro es int . Ahora puedes llamarlos sin preocuparte por nombres diferentes:

print("Hello world!"); //prints "This is a string: Hello world!"
print(1337);           //prints "This is an int: 1337"

En lugar de:

print("Hello world!");
print_int(1337);

Cuando tiene funciones sobrecargadas, el compilador infiere a cuál de las funciones llamar desde los parámetros que le proporciona. Se debe tener cuidado al escribir sobrecargas de funciones. Por ejemplo, con conversiones de tipo implícitas:

void print(int num)
{
    std::cout << "This is an int: " << num << std::endl;
}
void print(double num)
{
    std::cout << "This is a double: " << num << std::endl;
}

Ahora no está claro de inmediato a qué sobrecarga de print se llama cuando escribe:

print(5);

Y es posible que necesites darle algunas pistas a tu compilador, como:

print(static_cast<double>(5));
print(static_cast<int>(5));
print(5.0);

También se debe tener cuidado al escribir sobrecargas que aceptan parámetros opcionales:

// WRONG CODE
void print(int num1, int num2 = 0)    //num2 defaults to 0 if not included
{ 
    std::cout << "These are ints: << num1 << " and " << num2 << std::endl;
}
void print(int num)
{
    std::cout << "This is an int: " << num << std::endl;
}

Debido a que no hay forma de que el compilador sepa si una llamada como print(17) está destinada a la primera o la segunda función debido al segundo parámetro opcional, esto no se compilará.