Les fonctions en C++
La segmentation d'un programme en morceaux de code gérables est fondamentale pour la programmation dans tous les langages. Une fonction est un bloc de construction de base dans les programmes C++.
Jusqu'à présent, chaque exemple avait une fonction, main(), et utilisait généralement des fonctions de la bibliothèque standard. Dans ce cours, vous apprendrez à définir vos propres fonctions.
Une application C++ se compose de nombreuses fonctions, chacune fournissant une capacité distincte bien définie. L'exécution commence dans main(), qui doit être défini dans l'espace de noms global.
main() appelle d'autres fonctions, chacune pouvant appeler d'autres fonctions, et ainsi de suite. Les fonctions autres que main() peuvent être définies dans un espace de noms que vous créez.
Définir des fonctions
Une fonction est un bloc de code autonome avec un objectif spécifique. Les définitions de fonctions ont en général la même structure de base que main().
Structure d'une définition de fonction
Une définition de fonction consiste en un en-tête de fonction suivi d'un bloc contenant le code de la fonction. L'en-tête de fonction spécifie trois choses :
- 1. Type de retour : Le type de valeur que la fonction renvoie (ou void si rien n'est retourné).
- 2. Nom de la fonction : Les fonctions sont nommées selon les mêmes règles que les variables.
- 3. Liste des paramètres : Le nombre et les types des données passées à la fonction.
Syntaxe générale
type_retour nom_fonction(liste_parametres)
{
// Corps de la fonction...
}Exemple 1 : Fonction calculant un périmètre
Fonction perimetre()
La fonction suivante calcule le périmètre d'un rectangle défini par 2 × (longueur + largeur)
double perimetre(double largeur, double longueur)
{
double res;
res = 2 * (largeur + longueur);
return res;
}Explication :
- La fonction a deux paramètres :
largeuretlongueur(typedouble). - Elle calcule le périmètre et stocke le résultat dans une variable locale
res. - L'instruction
return res;renvoie la valeur calculée. - Le type de retour est
double, correspondant au résultat.
Appel de la fonction
double lar {3.4};
const double resultat = perimetre(lar, 2.7);Le terme argument est utilisé pour les valeurs transmises à une fonction lorsqu'elle est appelée. Ainsi, dans notre exemple, lar et 2.7 sont des arguments, et largeur et longueur sont les paramètres correspondants.
Règles importantes
- La séquence d'arguments doit correspondre à la séquence des paramètres (ordre et types).
- Si les types ne correspondent pas exactement, le compilateur applique des conversions implicites si possible.
- La combinaison du nom de la fonction et de la liste des paramètres est appelée la signature de la fonction.
- Le compilateur utilise la signature pour distinguer les fonctions (surtout pour la surcharge).
Exemple 2 : Fonction sans valeur de retour (void)
Toutes les fonctions ne doivent pas nécessairement renvoyer une valeur. Le mot-clé void est utilisé pour spécifier qu'une fonction ne renvoie pas de valeur.
void afficher(int a)
{
cout << "a : " << a;
}Explication :
- Le type de retour est
void(aucune valeur retournée). - La fonction affiche simplement la valeur à l'écran.
- Il n'y a pas d'instruction
return(ou éventuellementreturn;sans valeur).
Variables locales
Les variables que vous définissez dans le corps d'une fonction et tous les paramètres sont locaux à la fonction. Vous pouvez utiliser les mêmes noms dans d'autres fonctions à des fins très différentes.
La portée de chaque variable s'étend du point auquel elle est définie jusqu'à la fin du bloc qui la contient.
Les seules exceptions à cette règle sont les variables définies comme statiques (discutées plus tard).
Valeur de retour
Une fonction avec un type de retour autre que void doit retourner une valeur du type spécifié dans l'en-tête de la fonction.
La seule exception à cette règle est la fonction main(), où atteindre l'accolade fermante équivaut à renvoyer 0.
L'instruction return
La valeur de retour est calculée dans le corps de la fonction et est renvoyée par l'instruction return, qui termine la fonction. L'exécution continue ensuite à partir du point d'appel.
Comment la valeur est-elle retournée ?
Une copie de la valeur retournée est faite automatiquement, et cette copie est mise à la disposition de la fonction appelante. C'est pourquoi on peut retourner une variable locale : sa copie survit à la destruction de la variable.
Syntaxe de return
return expression;- expression doit évaluer à une valeur du type spécifié (ou convertible à ce type).
- expression peut inclure des appels de fonction (y compris récursifs).
- Pour une fonction
void:return;(sans expression).
Si le type de retour n'est pas void, toutes les branches de la fonction doivent renvoyer une valeur. Atteindre l'accolade fermante sans return est une erreur (sauf pour main()).
Déclarations de fonctions (Prototypes)
Les fonctions doivent être déclarées avant de pouvoir être appelées. Cela ne signifie pas qu'elles doivent être implémentées avant, mais que l'en-tête de la fonction doit être spécifié au début du fichier source pour que le compilateur sache qu'elle existe.
Ce type de déclaration est connu sous le nom de prototype de fonction.
Utilité d'un prototype
- Il décrit une fonction suffisamment pour que le compilateur puisse compiler les appels à cette fonction.
- Il définit le nom de la fonction, son type de retour et sa liste de paramètres.
- Une fonction ne peut être appelée que si l'appel est précédé d'une déclaration.
Exemple 3 : Utilisation d'un prototype
#include <iostream>
using namespace std;
double perimetre(double largeur, double longueur); // PROTOTYPE
int main(void)
{
double lar {3.4};
const double resultat = perimetre(lar, 2.7); // Appel (OK grâce au prototype)
cout << resultat;
return 0;
}
double perimetre(double lar, double lon) // DÉFINITION
{
double res;
res = 2 * (lar + lon);
return res;
}Caractéristiques des prototypes
- Un prototype se termine toujours par un point-virgule.
- Il n'est pas nécessaire qu'il soit identique à l'en-tête de la fonction.
- Les noms des paramètres peuvent être différents (mais pas les types).
- Les noms des paramètres sont optionnels (mais recommandés pour la documentation).
Forme minimale
double perimetre(double, double); // Noms des paramètres omisIl est recommandé d'écrire des prototypes pour chaque fonction définie dans un fichier source (sauf main()). Cela permet de :
- Placer les fonctions dans n'importe quel ordre dans le fichier.
- Éviter les erreurs de compilation dues à une séquence inadéquate.
- Donner aux autres programmeurs un aperçu des fonctionnalités du code.
Récapitulatif des éléments d'une fonction
| Élément | Description | Exemple |
|---|---|---|
| Type de retour | Type de la valeur retournée (ou void) | double, int, void |
| Nom | Identifiant de la fonction | perimetre, afficher |
| Paramètres | Liste des entrées de la fonction | (double largeur, double longueur) |
| Corps | Bloc de code entre accolades | { return 2*(l+L); } |
| Prototype | Déclaration avant utilisation | double perimetre(double, double); |
| Signature | Nom + liste des paramètres | perimetre(double, double) |
Écrire une fonction
Écrire une fonction maxDeux qui prend deux entiers en paramètres et retourne le plus grand des deux.
Contraintes :
- Écrire le prototype de la fonction.
- Écrire la définition complète de la fonction.
- Écrire un programme principal qui teste la fonction avec plusieurs paires de valeurs.
#include <iostream>
using namespace std;
// Prototype
int maxDeux(int a, int b);
int main()
{
// Tests
cout << "maxDeux(5, 3) = " << maxDeux(5, 3) << endl;
cout << "maxDeux(2, 7) = " << maxDeux(2, 7) << endl;
cout << "maxDeux(4, 4) = " << maxDeux(4, 4) << endl;
return 0;
}
// Définition de la fonction
int maxDeux(int a, int b)
{
if (a > b)
return a;
else
return b;
}maxDeux(5, 3) = 5 maxDeux(2, 7) = 7 maxDeux(4, 4) = 4
- Une fonction est un bloc de code réutilisable avec un objectif spécifique.
- La définition d'une fonction comprend : type de retour, nom, paramètres, corps.
- Les paramètres sont les variables définies dans l'en-tête ; les arguments sont les valeurs passées lors de l'appel.
- Une fonction peut retourner une valeur (type spécifié) ou rien (
void). - L'instruction
returntermine la fonction et renvoie une valeur (sauf pour void). - Les variables définies dans une fonction sont locales (portée limitée au bloc).
- Un prototype déclare une fonction avant son utilisation (se termine par ;).
- La signature d'une fonction (nom + paramètres) permet de la distinguer des autres.
- La fonction
main()est spéciale : pas de prototype nécessaire, return implicite 0.
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.