Complément sur les fonctions
Présentation
La surcharge de fonction est un nouvel outil de la programmation en C++. Cela consiste à déclarer deux fonctions de même nom, mais qui ne prennent pas les mêmes types de paramètres. On verra qu'il existe deux alternatives à la surcharge de fonction. La première concerne les classes et utilise le polymorphisme, et la seconde consiste a déclarer des fonctions templates (ces deux notions seront abordées plus tard).
Utilisation de la surcharge de fonction
Pour pouvoir utiliser la surcharge de fonction, il suffit de définir deux fonctions du même nom mais ne prenant pas les mêmes paramètres. Ensuite il ne reste plus qu'à appeler ces fonction "normalement". Lors de la surcharge de fonction, il est possible de faire changer la valeur renvoyée par la fonction, mais il faut savoir que cette modification de type ne doit pas être la seule. Eh oui, deux fonctions surchargées ne peuvent pas se différencier QUE par la valeur renvoyée.
Exemple d'utilisation
#include <iostream.h>
void affichage (char * texte, int pos)// sert a afficher les pos premier caractere de texte
{
for (int i=0; i<pos; i++)
cout<<texte[i];
cout<<endl;
}
void affichage (char * texte)//va afficher tout le contenu de texte
{
cout<<texte;<<endl;
}
/* bool affichage (char * texte) n'est pas possible car les prototypes de
deux fonctions ne se differencieraient que par le type de valeur renvoyée
*/
int main (void)
{
affichage ("blabli", 3);
affichage ("blabli");
return 0;
}
Cela affichera:
bla blabliMaintenant vous allez vous demander: "Mais a quoi sert la surcharge de fonction?". Je vais vous répondre: à pas grand chose, du fait que l'on peut facilement faire sans... Mais elle peut être utile dans le cas de deux fonctions qui vont avoir le même (ou presque) traitement, avec juste l'une d'elle qui a besoin d'un argument en plus, ou bien d'un petit changement de paramètre (int->float) par exemple.
Parametre par defaut
Il arrive des fois - comme pour la fonction affichage() traitée avant - que la surcharge ne soit pas réellement utile,
les deux fonctions surchargées ne différant que par l'apparition d'une constante. C'est pourquoi le C++ permet d'avoir des
fonctions qui prennent des paramètres par défaut. C'est a dire que si lors de l'appel de la fonction aucun paramètre n'est donné,
alors le paramètre prendra une valeur par défaut que l'on aura définie.
Le concept est relativement facile. Reprenons l'exemple du dessus avec des paramètres par défaut:
#include <iostream.h>
#include <string.h>
void affichage (char *texte, int pos=strlen(texte))
{
for (int i=0; i<pos; i++)
cout<<texte[i];
cout<<endl;
}
int main(void)
{
...
}
Cela va produire exactement le même résultat que la première version du programme, pour la simple et bonne raison que comme l'on n'a pas specifié de second paramètre, le programme va choisir de prendre comme int pos la taille de la chaîne de caractères.
Une petite dernière chose a propos des paramètres par défaut: ils doivent être place comme derniers paramètres. Je m'explique, si un paramètre est spécifié, alors tout les paramètres avant celui-ci doivent l'être aussi. Ainsi le prototype void affichage (int pos=4, char * texte); est incorrect.
Sur le même principe, si une fonction est prototypée: void affichage(char * texte="bla", int pos=4);, il sera incorrect de spécifier pos sans spécifier texte...