Sovraccarico di funzioni in C++
Questo articolo dimostrerà più metodi per utilizzare l’overload delle funzioni in C++.
Definisci le funzioni sovraccaricate in C++
L’overload di funzioni è noto come parte del polimorfismo ad hoc che fornisce le funzioni che possono essere applicate a oggetti di tipo diverso. Vale a dire, queste funzioni sono definite con lo stesso nome nell’ambito specificato e dovrebbero differire nel numero o nei tipi di argomenti. Nota che le funzioni sovraccaricate sono solo un insieme di funzioni diverse che vengono risolte in fase di compilazione. Quest’ultima caratteristica li differenzia dal polimorfismo di runtime, che viene utilizzato per le funzioni virtuali. Il compilatore osserva il tipo degli argomenti e sceglie quale funzione chiamare.
Le funzioni sovraccaricate devono differire per tipo di parametro o numero di parametri. In caso contrario, si verificherà l’errore del compilatore. Anche quando il tipo restituito è diverso tra le funzioni sovraccaricate o i tipi con alias vengono utilizzati come argomenti, il compilatore fallisce con un errore. Nell’esempio seguente, abbiamo implementato una struttura Math
che ha tre funzioni statiche
per la sommatoria dei numeri. Ciascuna delle funzioni accetta diversi tipi di coppie di argomenti e restituisce il tipo corrispondente. Di conseguenza, il Math::sum
può essere invocato con elementi vettoriali di tipo diverso. Nota che, la parola chiave struct
definisce una classe in C++ e i suoi membri sono pubblici per impostazione predefinita.
#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;
}
Produzione:
3; 6; 9; 12; 15;
3; 6; 9; 12; 15;
Usa funzioni sovraccaricate con modelli in C++
I modelli sono una forma di programmazione generica implementata nel linguaggio C++. Ha caratteristiche simili all’overload delle funzioni, poiché entrambi vengono dedotti in fase di compilazione. Si noti che il seguente frammento di codice ha la funzione printExponentVec
che restituisce gli elementi del vettore generico. Pertanto viene utilizzato per condurre la stessa operazione per ogni tipo, ma quando si desidera implementare corpi di funzione diversi per tipi diversi, è necessario utilizzare l’overload di funzioni.
#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;
}
Produzione:
1; 4; 9; 16; 25;
0; -2; -6; -12; -20;
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