Les fonctions permettent de décomposer un programme long et compliqué en parties plus simples à lire. En outre une fonction peut être réutilisée plusieurs fois dans le même programme, ce qui réduit le nombre de ligne à écrire.
type
nomDeLaFonction(arguments)
{
// Ce que fait la fonction.
return valeurDeRetour;
}
En exemple, découvrons une fonction qui calcule la moyenne de deux nombres :
double
fonctMoyenne(double
val1,
double val2)
{
double moyenne;
moyenne =
(val1
+ val2) /
2;
// Calcul de la moyenne.
return moyenne;
}
Pour utiliser cette fonction, nous la plaçons entre l'entête du programme qui contient les différents "#include ..." nécessaires, et la fonction "main()". Voilà ce que celà pourrait donner :
#include <iostream>
#include <stdlib.h>
// Nécessaire pour "system()".
using namespace std;
double
fonctMoyenne(double
val1,
double val2)
{
double moyenne;
moyenne =
(val1
+ val2) /
2;
// Calcul de la moyenne.
return moyenne;
}
int main()
{
double nombre1,
nombre2, moy;
cout <<
"Entrez un nombre : ";
cin >>
nombre1;
cout <<
"Entrez un deuxieme nombre : ";
cin >>
nombre2;
moy =
fonctMoyenne(nombre1,
nombre2);
// Utilisation de la fonction.
cout <<
"La moyenne de ces deux nombres est : "
<< moy;
cout <<
endl <<
endl;
// Séparation de 2 lignes pour faire propre.
system("PAUSE");
return 0;
}
Voici ce qu'on obtient :
Entrez un nombre : 9
Entrez un deuxième nombre : 15
La moyenne de ces deux nombres est : 12
Appuyez sur une touche pour continuer...
Examinons maintenant ce qui se passe dans la mémoire de l'ordinateur.
Au début du programme, nous déclarons 3 variables de type double,
puis nous entrons les valeurs 9 et 15.
L'appel de la fonction crée deux nouvelles variables val1 et val2
qui recoivent respectivement les valeurs de nombre1 et nombre2.
Il faut bien comprendre que val1 et nombre1 ont des adresses différentes, mais des contenus identiques.
De même pour val2 et nombre2.
A noter que nous aurions pu donner le nom de nombre1 à val1 sans créer de confusion pour le programme,
car val1 et val2 sont des variables qui n'appartiennent qu'à la fonction.
La variable "moyenne", locale à la fonction est créée, et se voit attribuer la valeur 12
comme résultat du calcul.
A l'instant de quitter la fonction, la valeur 12 est recopiée dans moy,
puis les variables val1, val2, et moyenne sont détruite.
Nous appelons ce type de communication entre le programme principale et la fonction, une transmission par valeur. Dans certain cas, ce type de transmission ne convient pas et nous utilisons alors la transmission par référence.
Nous allons découvrir un cas d'école fréquemment rencontré, la fonction échange de variables.
#include <iostream>
#include <stdlib.h>
// Nécessaire pour "system()".
using namespace std;
void
fonctEchange(double&
var1,
double& var2)
{
double c;
// Variable temporaire.
c = var1;
var1 = var2;
// a prend la valeur de b.
var2 = c;
// b prend la valeur de a.
}
int main()
{
double
a(10),
b(2.5);
cout <<
"Avant l'echange a = "
<< a <<
", et b = " << b
<<
endl;
fonctEchange(a,
b);
cout <<
"Apres l'echange a = "
<< a <<
", et b = " << b
<<
endl;
cout <<
endl <<
endl;
// Séparation de 2 lignes pour faire propre.
system("PAUSE");
return 0;
}
Voici ce qu'on obtient :
Avant l'echange a = 10 b = 2.5
Apres l'echange a = 2.5 b = 10
Appuyez sur une touche pour continuer...
La fonction ne renvoie rien, elle utilise ses propres variables et pourtant a et b sont modifiés.
Quel est ce mystère ?
Tout est dans cette ligne :
void fonctEchange(double& var1, double& var2)
Avez-vous remarqué la présence de l'esperluette
(&) ?
C'est elle qui provoque la transmission par référence.
je vous explique :
Lorsque l'esperluette est ajoutée juste après le type d'argument, alors la fonction ne travaille plus
avec sa propre variable locale, mais avec la variable que lui transmet le programme principal.
Oui mais "var1" et "a" sont bien des variables différentes non ?
Justement non et vous connaissez des exemples dans la vie courante :
La télévision que vous appelez la télé, ou encore tv. C'est bien le même objet et pourtant vous lui donnez plusieurs noms.
Un coup de masse sur votre télé, ou votre tv, donnera le même résultat : Pas de match de foot ce soir !!!
Je m'en fiche je ne regarde jamais :)
Vous avez compris pour notre fonction on a la même variable (une adresse commune) mais
un nom pour l'utilisation dans la fonction (c'est "var1" ici), et un autre pour l'utilisation dans
le programme principal (c'est "a" ici).
C'est obligatoire des noms différents ?
Pas du tout car la fonction traitera sa variable comme si elle était locale. Donc vous pouvez et vous avez même
intêret à utiliser des noms identiques pour ne pas trop multiplier les noms à l'infini.