Dès le début de ce cours, nous avons utilisé des fonctions, toujours la même en fait. La fonction
main(). C'est le point d'entrée de tous les programmes C++, c'est par là que tout commence.
Code : C++ | #include <iostream>
using namespace std;
int main() //Debut de la fonction main() et donc du programme
{
cout << "Bonjour tout le monde !" << endl;
return 0;
} //Fin de la fonction main() et donc du programme
|
Le programme commence réellement à la ligne 4 et se termine à la ligne 8 après l'accolade fermante. C'est-à-dire que tout se déroule dans une seule et unique fonction. On n'en sort pas. Il n'y a qu'une seule portion de code qui est exécutée dans l'ordre sans jamais sauter ailleurs.
Alors, si je vous dis tout ça, c'est vous vous en doutez, que l'on peut écrire d'autres fonctions. Et donc avoir un programme découpé en plusieurs modules indépendants.
Pourquoi vouloir faire ça ?
C'est vrai après tout, mettre l'entièreté du code dans la fonction
main() est tout à fait possible. Ce n'est cependant pas une bonne pratique.
Imaginons que nous voulions créer un jeu vidéo 3D. Comme c'est quand même assez complexe, le code source va nécessiter plusieurs dizaines de milliers de lignes !

Si l'on garde tout dans une seule fonction, il va être très difficile de s'y retrouver. Il serait certainement plus simple d'avoir un morceau de code dans un coin qui fait bouger un personnage et un autre bout de code ailleurs qui charge les niveaux, etc. Découper son programme en fonctions permet de s'
organiser.
En plus, si vous êtes plusieurs programmeurs à travailler sur le même programme, vous pourrez vous partager plus facilement le travail. Chacun travaille sur une fonction différente.
Mais ce n'est pas tout !
Prenons par exemple le calcul de la racine carrée. Si vous créez un programme de maths, il est bien possible que vous ayez besoin à plusieurs endroits d'effectuer des calculs de racine. Avoir une fonction

va nous permettre de faire plusieurs de ces calculs sans avoir à recopier le même code à plusieurs endroits. On peut
utiliser plusieurs fois la même fonction et c'est une des raisons principales d'en écrire.
Présentation des fonctions
Une fonction est un morceau de code qui accomplit une tâche particulière. Elle reçoit des données à traiter, effectue des actions avec et finalement renvoie une valeur.
Les données entrantes s'appellent les
arguments et on utilise l'expression
valeur retournée pour les éléments qui sortent de la fonction.
Vous vous souvenez de

? La fonction qui permet de calculer des puissances ? En utilisant le nouveau vocabulaire, on peut dire que cette fonction :
- reçoit deux arguments.
- effectue un calcul mathématique.
- renvoie le résultat du calcul.
En utilisant un schéma comme le précédent, on peut imaginer

comme ceci :
Vous en avez déjà fait l'expérience, on peut utiliser cette fonction plusieurs fois. Ce qui implique que nous ne sommes pas obligés de copier le code (compliqué) qui se trouve à l'intérieur de

à chaque fois que l'on souhaite effectuer un calcul de puissance.
Définir une fonction
Bon bon, il est temps d'attaquer le concret. Il faut que je vous montre comment définir une fonction. Je pourrais vous dire de regarder comment
main() est fait et vous laisser patauger, mais je suis sympa. Je vais vous guider
Vous êtes prêt ? Alors allons-y !
Toutes les fonctions ont la forme suivante :
Code : C++ | type nomFonction(arguments)
{
//Instructions effectuées par la fonction
}
|
On retrouve les trois éléments dont je vous ai déjà parlé auxquels s'ajoute le nom de la fonction.
- Le premier élément est le type de retour. Il permet d'indiquer le type de variable renvoyé par la fonction. Si votre fonction doit renvoyer du texte, alors ce sera string, si votre fonction effectue un calcul, alors ce sera int ou double.
- Le deuxième élément est le nom de la fonction. Vous connaissez déjà main(), pow() ou sqrt(). L'important est de choisir un nom de fonction qui décrit bien ce que fait la fonction. Comme pour les variables en fait.
- Entre les parenthèses, on trouve la liste des arguments de la fonction. Ce sont les données avec lesquelles la fonction va travailler. Il peut y avoir un argument (comme pour sqrt()), plusieurs arguments (comme pour pow()) ou aucun argument (comme pour main()).
- Finalement, il y a des accolades qui délimitent le contenu de la fonction. Toutes les opérations qui seront effectuées se trouvent entre les deux accolades.
Il est possible de créer plusieurs fonctions ayant le même nom. Il faut alors que la liste des arguments des deux fonctions soit différente. C'est ce qu'on appelle la surcharge d'une fonction.
Dans un même programme, il peut par exemple y avoir la fonction int addition(int a, int b) et la fonction double addition(double a, double b). Les deux fonctions ont le même nom mais une travaille avec des entiers et l'autre avec des nombres réels.
Créons donc des fonctions !
Une fonction toute simple
Commençons par une fonction basique. Une fonction qui reçoit un nombre entier, ajoute 2 à ce nombre et le renvoie.
Code : C++ | int ajouteDeux(int nombreRecu)
{
int valeur(nombreRecu + 2); //On cree une case en memoire.
//On prend le nombre recu en argument, on y ajoute 2.
//Et on met tout ça dans la memoire.
return valeur; //On indique que la valeur qui sort de la fonction
//est la valeur de la variable 'valeur'
}
|
Il n'y a pas de point-virgule ! Ni après la déclaration, ni après l'accolade fermante.
Analysons ce code en détail. Il y a deux lignes vraiment nouvelles pour vous.
Avec ce que je vous ai expliqué, vous devriez comprendre la première ligne. On déclare une fonction nommée
ajouteDeux qui va recevoir un nombre entier en argument et qui, une fois qu'elle aura terminé, va recracher un autre nombre entier.
Toutes les lignes suivantes utilisent des choses déjà connues sauf l'avant-dernière. Si vous vous posez des questions sur ces lignes, je vous invite à relire le chapitre sur l'
utilisation de la mémoire.
Le
return de l'avant-dernière ligne indique quelle valeur va ressortir de la fonction. En l'occurrence, c'est la valeur de la variable
valeur qui va être renvoyée.
Appeler une fonction
Bon, c'est bien joli tout ça, mais il faut encore apprendre à l'utiliser cette fonction. C'est vrai, mais vous savez déjà le faire. Souvenez-vous des fonctions mathématiques !
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | #include <iostream>
using namespace std;
int ajouteDeux(int nombreRecu)
{
int valeur(nombreRecu + 2);
return valeur;
}
int main()
{
int a(2),b(2);
cout << "Valeur de a : " << a << endl;
cout << "Valeur de b : " << b << endl;
b = ajouteDeux(a); //Appel de la fonction
cout << "Valeur de a : " << a << endl;
cout << "Valeur de b : " << b << endl;
return 0;
}
|
On retrouve la syntaxe que l'on connaissait déjà :
résultat = fonction(argument). Facile pour ainsi dire !
Vous avez essayé le programme ? Vous devriez toujours essayer les exemples. Voici quand même ce que ça donne :
Code : Console | Valeur de a : 2
Valeur de b : 2
Valeur de a : 2
Valeur de b : 4 |
Après l'appel à la fonction, la variable
b a été modifiée. Tout fonctionne donc comme annoncé.
Plusieurs paramètres
On n'est pas encore au bout de nos peines. Il y a des fonctions qui prennent plusieurs paramètres, comme
pow() et
getline() par exemple.
Pour passer plusieurs paramètres à une fonction, il faut les séparer par des virgules.
Code : C++ | int addition(int a, int b)
{
return a+b;
}
double multiplication(double a, double b, double c)
{
return a*b*c;
}
|
La première de ces fonctions calcule la somme des deux nombres qui lui sont fournis alors que la deuxième calcule le produit des trois nombres reçus.
Pas d'arguments
A l'inverse, il est aussi possible de créer des fonctions sans arguments.

Il faut simplement ne rien écrire entre les parenthèses !
Mais à quoi ça sert ?
On peut imaginer plusieurs scénarios, mais pensez par exemple à une fonction qui demande à l'utilisateur d'entrer son nom. Elle n'a pas besoin de paramètres.
Code : C++ | string demanderNom()
{
cout << "Entrez votre nom : ";
string nom;
cin >> nom;
return nom;
}
|
Je suis sûr que vous trouverez plein d'exemples par la suite ! Même si c'est vrai que ce type de fonctions est plus rare.
Des fonctions qui ne renvoient rien
Tous les exemples que je vous ai donnés jusque-là prenaient des arguments et renvoyaient une valeur. Mais il est aussi possible d'écrire des fonctions qui ne renvoient rien. Enfin presque.
Rien ne ressort de la fonction, mais quand on la déclare, il faut quand même indiquer un type. On utilise le "type"
void, ce qui signifie
néant en anglais. Ça veut tout dire, il n'y a réellement rien qui ressort de la fonction.
Code : C++ - Une fonction ne renvoyant rien 1
2
3
4
5
6
7
8
9
10
11
12 | void direBonjour()
{
cout << "Bonjour !" << endl;
//Comme rien ne ressort, il n'y a pas de return !
}
int main()
{
direBonjour(); //Comme la fonction ne renvoie rien, on l'appelle
//sans mettre la valeur de retour dans une variable
return 0;
}
|
Avec ce dernier point, nous avons fait le tour de la théorie. Dans la suite du chapitre, je vous propose quelques exemples et un super schéma récapitulatif. Ce n'est pas le moment de partir.