Funciones y Overloading
C++ te permite declarar múltiples funciones con el mismo nombre siempre que sus tipos de parámetros difieran — esto es function overloading. El compilador elige la correcta en tiempo de compilación según los tipos de los argumentos en el punto de llamada, sin ningún costo ni dispatch en tiempo de ejecución.
#include <iostream>
using namespace std;
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int main() {
cout << add(3, 4) << endl;
cout << add(3.5, 2.5) << endl;
return 0;
}7 6
Argumentos por defecto
Un parámetro puede tener un valor por defecto, usado cuando quien llama omite ese argumento. Es una alternativa más simple al overloading cuando lo único que cambia entre versiones de una función es un valor final.
#include <iostream>
using namespace std;
int multiply(int a, int b = 2) {
return a * b;
}
int main() {
cout << multiply(5) << endl;
cout << multiply(5, 3) << endl;
return 0;
}10 15
Cómo se ve un error real de resolución de overload
La resolución de overload solo funciona cuando el compilador puede hacer coincidir la llamada con exactamente un candidato mediante sus reglas normales de conversión — no va a convertir silenciosamente un argumento mediante una conversión que no sea implícita e inequívoca. Esto es genuinamente lo que reporta g++ cuando ningún overload coincide — capturado de una ejecución real, no escrito para parecer plausible:
#include <iostream>
using namespace std;
void greet(int id) {
cout << "id: " << id << endl;
}
void greet(double score) {
cout << "score: " << score << endl;
}
int main() {
greet("hello");
return 0;
}main.cpp: In function ‘int main()’:
main.cpp:13:11: error: invalid conversion from ‘const char*’ to ‘int’ [-fpermissive]
13 | greet("hello");
| ^~~~~~~
| |
| const char*
main.cpp:4:16: note: initializing argument 1 of ‘void greet(int)’
4 | void greet(int id) {
| ~~~~^~Un string literal no puede convertirse silenciosamente en un int o un double, así que ningún overload coincide, y todo el programa falla al compilar en vez de elegir un candidato sorprendente.
Siguiente: control de flujo — if/else, for, while, y switch.
Practice exercise
Escribe dos overloads de square: uno para int, uno para double. Llama a square(6) e imprime el resultado.