Funções Sobrecarregadas
**Conceito de Função Sobrecarregada (Function Overload):**A mesma função pode ser definida com nomes idênticos, mas com parâmetros diferentes (em tipo ou quantidade). Isso é chamado de sobrecarga de funções. Observação: o significado da função muda dependendo dos parâmetros utilizados, e os corpos das funções sobrecarregadas também devem ser diferentes.
Critérios para Identificar uma Função Sobrecarregada:
- Número diferente de parâmetros.
- Tipos de parâmetros distintos.
- Ordem dos parâmetros variável. Nota: O tipo de retorno não é um critério válido para diferenciar funções sobrecarregadas.
Regras para Chamada de Funções Sobrecarregadas:
- Os argumentos reais devem garantir unicidade, evitando ambiguidades entre duas funções sobrecarregadas.
- Parâmetros padrão podem ser combinados com sobrecargas, desde que a correspondência final seja inequívoca.
#include <iostream>
using namespace std;
void func(int x, int y = 0) {
cout << "Sobrecarga de função 1" << endl;
}
void func(int x, int y, int z) {
cout << "Sobrecarga de função 2" << endl;
}
int main() {
// func(1, 1); // Pode causar ambiguidade entre as sobrecargas
func(1, 1, 1);
return 0;
}
Saída do Código:
Sobrecarga de função 2
Funções Sobrecarregadas e Ponteiros para FunçõesPonteiros para funções armazenam o endereço de entrada de uma função específica. Ao atribuir uma função sobrecarregada a um ponteiro, o número de argumentos passaods ao ponteiro resolve qual versão da função será executada.
int operation(int a) {
return a * 2;
}
int operation(int a, int b) {
return a + b;
}
int operation(const char* str) {
return strlen(str);
}
typedef int (*PTR_OPERATION)(int);
int main() {
int result = 0;
PTR_OPERATION ptrOp = operation; // Atribui a função com um único parâmetro inteiro
result = ptrOp(5);
cout << "Resultado: " << result << endl;
return 0;
}
Combinação de Funções Sobrecarregadas e Ponteiros para Funções
#include <iostream>
using namespace std;
void display(int value) {
printf("Valor inteiro: %d\n", value);
}
void display(const char* text) {
printf("Texto: %s\n", text);
}
void display(int x, int y) {
printf("Dois valores inteiros: %d e %d\n", x, y);
}
// Declaração de tipo de ponteiro para função
typedef void (*PTR_DISPLAY)(int, int);
int main() {
PTR_DISPLAY ptrDisplay;
// Atribuição da função sobrecarregada com dois parâmetros inteiros
ptrDisplay = [](int a, int b) { display(a, b); };
ptrDisplay(10, 20);
cout << "Fim do programa." << endl;
return 0;
}