Surcharge de fonction en C++
Cet article présentera plusieurs méthodes d’utilisation de la surcharge de fonction en C++.
Définir des fonctions surchargées en C++
La surcharge de fonction est connue comme faisant partie du polymorphisme ad hoc qui fournit les fonctions pouvant être appliquées à des objets de différents types. A savoir, ces fonctions sont définies avec le même nom dans la portée donnée, et elles doivent différer par le nombre ou les types d’arguments. Notez que les fonctions surchargées ne sont qu’un ensemble de fonctions différentes qui sont résolues au moment de la compilation. Cette dernière caractéristique les différencie du polymorphisme d’exécution, qui est utilisé pour les fonctions virtuelles. Le compilateur observe le type des arguments et choisit la fonction à appeler.
Les fonctions surchargées doivent différer par le type de paramètre ou un certain nombre de paramètres. Sinon, l’erreur du compilateur se produira. Même lorsque le type de retour est différent parmi les fonctions surchargées ou que les types d’alias sont utilisés comme arguments, le compilateur échoue avec une erreur. Dans l’exemple suivant, nous avons implémenté une structure Math
qui a trois fonctions statiques
pour la sommation des nombres. Chacune des fonctions prend différents types de paires d’arguments et renvoie le type correspondant. En conséquence, le Math::sum
peut être invoqué avec des éléments vectoriels d’un type différent. Notez que le mot-clé struct
définit une classe en C++ et que ses membres sont publics par défaut.
#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;
}
Production:
3; 6; 9; 12; 15;
3; 6; 9; 12; 15;
Utiliser des fonctions surchargées avec des modèles en C++
Les modèles sont une forme de programmation générique implémentée dans le langage C++. Il a des caractéristiques similaires à la surcharge de fonction, car les deux sont déduits au moment de la compilation. Notez que l’extrait de code suivant a la fonction printExponentVec
qui renvoie les éléments du vecteur générique. Ainsi, il est utilisé pour effectuer la même opération pour chaque type, mais lorsque nous voulons implémenter différents corps de fonction pour différents types, la surcharge de fonction doit être utilisée.
#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;
}
Production:
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