AnyCompiler

Functions e Overloading

C++ permite declarar múltiplas functions com o mesmo nome desde que seus tipos de parâmetros sejam diferentes — isso é function overloading. O compilador escolhe a certa em tempo de compilação com base nos tipos dos argumentos no ponto de chamada, sem nenhum custo ou dispatch em tempo de execução.

#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;
}
Output
7
6

Argumentos padrão

Um parâmetro pode ter um valor padrão, usado sempre que quem chama omite esse argumento. É uma alternativa mais simples ao overloading quando a única coisa que muda entre versões de uma function é um 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;
}
Output
10
15

Como é um erro real de resolução de overload

A resolução de overload só funciona quando o compilador consegue casar a chamada com exatamente um candidato através de suas regras normais de conversão — ele não vai converter silenciosamente um argumento através de uma conversão que não seja implícita e inequívoca. Isso é genuinamente o que o g++ relata quando nenhum overload corresponde — capturado de uma execução real, não escrito para parecer plausível:

#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;
}
Output
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) {
      |            ~~~~^~

Um string literal não pode silenciosamente virar um int ou um double, então nenhum overload corresponde, e o programa inteiro falha ao compilar em vez de escolher um candidato surpreendente.

A seguir: controle de fluxo — if/else, for, while, e switch.

Practice exercise

Escreva dois overloads de square: um para int, um para double. Chame square(6) e imprima o resultado.