Si je vous dis "paramètre de fonction", vous voyez de quoi je parle n'est-ce pas ?
Je l'espère, parce qu'il serait temps de le savoir à votre niveau maintenant.
Bon allez, un petit rappel !
Comme un petit rappel ne fait jamais de mal, voici un exemple de fonction :
Code : C++ | int nombreDeSecondes(int heures, int minutes, int secondes)
{
int total = 0;
total = heures * 60 * 60;
total += minutes * 60;
total += secondes;
return total;
}
|
Cette fonction calcule le nombre de secondes en additionnant les heures, minutes et secondes qu'on lui envoie. Rien de bien compliqué !
Les variables
heures,
minutes et
secondes sont les
paramètres de la fonction nombreDeSecondes. Ce sont des valeurs qu'elle reçoit, celles avec lesquelles elle va travailler.
Il est facile de reconnaître les paramètres d'une fonction, car ceux-ci se trouvent toujours écrits entre les parenthèses.
Les valeurs par défaut
La nouveauté en C++, c'est qu'on peut donner des valeurs par défaut à certains paramètres de nos fonctions. Ainsi, on ne sera pas obligé d'indiquer à chaque fois tous les paramètres lorsqu'on appelle une fonction !
Pour bien voir comment on doit procéder, on va regarder le code complet. J'aimerais que vous le copiez dans votre IDE pour faire les tests en même temps que moi :
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | #include <iostream>
using namespace std;
// Prototype de la fonction
int nombreDeSecondes(int heures, int minutes, int secondes);
// Main
int main()
{
cout << nombreDeSecondes(1, 10, 25) << endl;
return 0;
}
// Définition de la fonction
int nombreDeSecondes(int heures, int minutes, int secondes)
{
int total = 0;
total = heures * 60 * 60;
total += minutes * 60;
total += secondes;
return total;
}
|
Ce code donne le résultat suivant :
Code : Console
Sachant qu'1 heure = 3600s, 10 minutes = 600s, 25 secondes =... 25s, le résultat est logique car 3600 + 600 + 25 = 4225.

Bref, tout va bien.
Maintenant supposons que l'on veuille rendre certains paramètres facultatifs, par exemple parce qu'on utilise en pratique plus souvent les heures que le reste.
On va devoir modifier le prototype de la fonction (et non sa définition, attention).
Indiquez la valeur par défaut que vous voulez donner aux paramètres si on ne les a pas renseigné lors de l'appel de la fonction :
Code : C++ | int nombreDeSecondes(int heures, int minutes = 0, int secondes = 0);
|
Dans cet exemple, seul le paramètre heures sera obligatoire, les deux autres étant désormais facultatifs. Si on ne renseigne pas les minutes et les secondes, les variables vaudront alors 0 dans la fonction.
Voici le code complet que vous devriez avoir sous les yeux :
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | #include <iostream>
using namespace std;
// Prototype avec les valeurs par défaut
int nombreDeSecondes(int heures, int minutes = 0, int secondes = 0);
// Main
int main()
{
cout << nombreDeSecondes(1, 10, 25) << endl;
return 0;
}
// Définition de la fonction, SANS les valeurs par défaut
int nombreDeSecondes(int heures, int minutes, int secondes)
{
int total = 0;
total = heures * 60 * 60;
total += minutes * 60;
total += secondes;
return total;
}
|
Si vous avez lu attentivement ce code, vous avez dû vous rendre compte de quelque chose :
les valeurs par défaut sont spécifiées uniquement dans le prototype, PAS dans la définition de la fonction ! On se fait souvent avoir, je vous préviens...

Si vous vous trompez, le compilateur vous indiquera une erreur à la ligne de la définition de la fonction.
Bon, ce code ne change pas beaucoup du précédent. A part les valeurs par défaut dans le prototype, rien n'a été modifié (et le résultat à l'écran sera toujours le même).
La nouveauté maintenant, c'est qu'on peut supprimer des paramètres lors de l'appel de la fonction (ici dans le
main). On peut par exemple écrire :
Code : C++ | cout << nombreDeSecondes(1) << endl;
|
Le compilateur lit les paramètres de gauche à droite. Comme il n'y en a qu'un et que seules les heures sont obligatoires, il devine que la valeur "1" correspond à un nombre d'heures.
Le résultat à l'écran sera le suivant :
Code : Console
Mieux encore, vous pouvez indiquer juste les heures et les minutes si vous le désirez :
Code : C++ | cout << nombreDeSecondes(1, 10) << endl;
|
Code : Console
Du temps que vous indiquez au moins les paramètres obligatoires, il n'y a pas de problème.
Cas particuliers, attention danger
Bon, mine de rien il y a quand même quelques pièges, ce n'est pas si simple que ça !

On va voir ces pièges sous la forme de questions / réponses :
Et si je veux envoyer à la fonction juste les heures et les secondes, mais pas les minutes ?
Tel quel, c'est impossible. En effet, je vous l'ai dit plus haut, le compilateur va analyser les paramètres de gauche à droite. Le premier correspondra forcément aux heures, le second aux minutes et le troisième aux secondes.
Vous ne pouvez PAS écrire :
Code : C++ | cout << nombreDeSecondes(1,,25) << endl;
|
C'est interdit. Si vous le faites, le compilateur vous fera comprendre qu'il n'apprécie guère vos manoeuvres. C'est comme ça : en C++, on ne peut pas "sauter" des paramètres, même s'ils sont facultatifs. Si vous voulez indiquer le premier et le dernier paramètre, il vous faudra obligatoirement spécifier ceux du milieu. On devra donc écrire :
Code : C++ | cout << nombreDeSecondes(1, 0, 25) << endl;
|
Est-ce que je peux rendre juste les heures facultatives, et rendre les minutes et secondes obligatoires ?
Si le prototype est défini dans le même ordre que tout à l'heure : non.
Les paramètres facultatifs doivent obligatoirement se trouver à la fin (à droite).
Ce code ne compilera donc pas :
Code : C++ | int nombreDeSecondes(int heures = 0, int minutes, int secondes);
// Erreur, les paramètres par défaut doivent être à droite
|
La solution, pour régler ce problème, consiste à placer le paramètre
heures à la fin :
Code : C++ | int nombreDeSecondes(int secondes, int minutes, int heures = 0);
// OK
|
Est-ce que je peux rendre tous mes paramètres facultatifs ?
Oui, ça ne pose pas de problème :
Code : C++ | int nombreDeSecondes(int heures = 0, int minutes = 0, int secondes = 0);
|
Dans ce cas, l'appel de la fonction pourra être fait comme ceci :
Code : C++ | cout << nombreDeSecondes() << endl;
|
Le résultat retourné sera bien entendu 0 dans notre cas.
Règles à retenir
En résumé, il y a 2 règles que vous devez retenir pour les valeurs par défaut :
- Seul le prototype doit contenir les valeurs par défaut (pas la définition de la fonction).
- Les valeurs par défaut doivent se trouver à la fin de la liste des paramètres ("à droite").