Sobrecarga de função em C++

Jinku Hu 12 outubro 2023
  1. Definir funções sobrecarregadas em C++
  2. Use funções sobrecarregadas com modelos em C++
Sobrecarga de função em C++

Este artigo demonstrará vários métodos de uso de sobrecarga de função em C++.

Definir funções sobrecarregadas em C++

A sobrecarga de função é conhecida como uma parte do polimorfismo ad hoc que fornece as funções que podem ser aplicadas a objetos de diferentes tipos. Ou seja, essas funções são definidas com o mesmo nome no escopo fornecido e devem diferir no número ou tipos de argumentos. Observe que as funções sobrecarregadas são apenas um conjunto de funções diferentes que são resolvidas em tempo de compilação. O último recurso os diferencia do polimorfismo de tempo de execução, que é usado para funções virtuais. O compilador observa o tipo dos argumentos e escolhe qual função chamar.

As funções sobrecarregadas devem diferir no tipo de parâmetro ou em vários parâmetros. Caso contrário, ocorrerá o erro do compilador. Mesmo quando o tipo de retorno é diferente entre funções sobrecarregadas ou tipos com alias são usados ​​como argumentos, o compilador falha com um erro. No exemplo a seguir, implementamos uma estrutura Math que possui três funções estáticas para soma de números. Cada uma das funções leva diferentes tipos de pares de argumentos e retorna o tipo correspondente. Como resultado, o Math::sum pode ser invocado com elementos de vetor de um tipo diferente. Observe que, a palavra-chave struct define uma classe em C++ e seus membros são públicos por padrão.

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

struct Math {
  static auto sum(int x, int y) { return x + y; }

  static auto sum(float x, float y) { return x + y; }

  static auto sum(double x, double y) { return x + y; }
};

int main() {
  vector<int> vec1 = {1, 2, 3, 4, 5};
  vector<float> vec2 = {1.0, 2.0, 3.0, 4.0, 5.0};

  for (const auto &item : vec1) {
    cout << Math::sum(item, item * 2) << "; ";
  }
  cout << endl;

  for (const auto &item : vec2) {
    cout << Math::sum(item, item * 2) << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Resultado:

3; 6; 9; 12; 15;
3; 6; 9; 12; 15;

Use funções sobrecarregadas com modelos em C++

Os modelos são uma forma de programação genérica implementada na linguagem C++. Ele tem recursos semelhantes para sobrecarga de função, já que ambos são inferidos em tempo de compilação. Observe que o fragmento de código a seguir tem a função printExponentVec que produz os elementos do vetor genérico. Portanto, ele é utilizado para conduzir a mesma operação para cada tipo, mas quando queremos implementar diferentes corpos de função para diferentes tipos, a sobrecarga de função deve ser usada.

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

struct ExponentTwo {
  static auto Calc(int n) { return n * n; }
  static auto Calc(float n) { return n - n * n; }
  static auto Calc(double n) { return n + n * n; }
};

template <typename T>
void printExponentVec(const vector<T> &vec) {
  for (auto &i : vec) {
    cout << ExponentTwo::Calc(i) << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {1, 2, 3, 4, 5};
  vector<float> vec2 = {1.0, 2.0, 3.0, 4.0, 5.0};

  printExponentVec(vec1);
  printExponentVec(vec2);

  return EXIT_SUCCESS;
}

Resultado:

1; 4; 9; 16; 25;
0; -2; -6; -12; -20;
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C++ Function