Chap 10 – Passage des paramètres à une fonction
Document réservé
Vous consultez actuellement la présentation publique de ce chapitre.
Les documents PDF complets, comprenant les développements théoriques, les exemples détaillés et les exercices, sont disponibles sur demande.
Pour obtenir un accès, contactez-moi via la page Contact en indiquant les domaines qui vous intéressent (C++, ESP-IDF, électronique, etc.).
10.1 Passage des paramètres à une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.2 Passage par valeur (passage par copie) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.4 Passage par référence constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Chapitre 10 – Passage des paramètres à une fonction
Chapitre 10 – Passage des paramètres à une fonction
Passage des paramètres à une fonction
Jusqu’à présent, nous avons utilisé des fonctions dont les paramètres étaient principalement des variables de type
int, double ou char. Nous avons également vu qu’il était possible de transmettre des tableaux, des chaînes de
caractères et des structures.
Cependant, toutes ces données ne sont pas transmises de la même manière.
Le choix de la méthode de transmission d’un paramètre est très important. Il influence le fonctionnement de la
fonction, les performances du programme et la possibilité ou non de modifier les variables du programme appelant.
Dans ce chapitre, nous allons étudier les quatre principales façons de transmettre un paramètre à une fonction :
• le passage par valeur (passage par copie) ;
• le passage par référence ;
• le passage par référence constante ;
• le passage par pointeur.
Afin de mettre en évidence les différences entre ces méthodes, nous utiliserons tout au long de ce chapitre la même
structure Date. Seule la manière de transmettre le paramètre changera.
Passage par valeur (passage par copie)
Lorsqu’un paramètre est transmis par valeur, la fonction reçoit une copie de la variable passée en argument.
Les modifications effectuées sur cette copie n’ont donc aucun effet sur la variable du programme appelant.
Le programme suivant illustre ce principe.
void modifier(Date d)
Date aujourdHui = {31, 7, 2026};
modifier(aujourdHui);
std::cout << aujourdHui.annee << std::endl;
Program ended with exit code: 0
AccueilChapitre 10 – Passage des paramètres à une fonction Bien que la fonction modifie le membre annee, la variable aujourdHui n’est pas modifiée. En effet, la fonction ne travaille pas directement sur la variable du programme appelant. Elle reçoit une copie de Fig. 1 – Passage par valeur ou encore, passage par copie. • Lors d’un passage par valeur, la fonction reçoit une copie du paramètre. • Toute modification effectuée dans la fonction concerne uniquement cette copie et n’a aucun effet sur la variable du programme appelant. Le passage par valeur est particulièrement adapté aux types fondamentaux tels que En effet, ces types occupent très peu de mémoire et leur copie est extrêmement rapide.
AccueilChapitre 10 – Passage des paramètres à une fonction Il est utilisé lorsque la fonction doit travailler sur une copie indépendante du paramètre afin de ne pas modifier la variable du programme appelant. Passage par référence Lorsqu’un paramètre est transmis par référence, la fonction ne reçoit pas une copie de la variable, mais un alias de Les modifications effectuées dans la fonction agissent donc directement sur la variable du programme appelant. Le programme suivant illustre ce principe. void modifier(Date& d) Date aujourdHui = {31, 7, 2026}; modifier(aujourdHui); std::cout << aujourdHui.annee << std::endl; Program ended with exit code: 0 Contrairement au passage par valeur, aucune copie de la structure n’est réalisée. Le paramètre d est un alias de la variable aujourdHui. Les deux noms désignent donc exactement la même structure Toute modification effectuée sur d modifie également aujourdHui. • Lors d’un passage par référence, la fonction reçoit un alias du paramètre. • Aucune copie n’est réalisée. Toute modification effectuée dans la fonction agit directement sur la variable du programme appelant.
AccueilChapitre 10 – Passage des paramètres à une fonction Le passage par référence est recommandé lorsqu’une fonction doit modifier une variable du programme appelant. Comme aucune copie n’est réalisée, cette méthode est également plus efficace pour les objets volumineux. void modifier(Date& d) Date d1 = {31, 7, 2026}; std::cout << d1.annee << std::endl; Une référence reste une référence. Qu’elle soit déclarée dans une fonction ou dans le programme principal, elle constitue toujours un alias de la variable à laquelle elle est liée.
AccueilChapitre 10 – Passage des paramètres à une fonction void modifier(int& w) std::cout << rd << » » << &d << std::endl; » << &rd << std::endl; Dans ce programme, le symbole & apparaît trois fois. A-t-il toujours la même signification ? La réponse est Déclare une référence. Déclare un paramètre transmis par référence. Donne l’adresse mémoire de la variable d. Table 1 – Les différentes significations du symbole &. Les opérateurs & et ∗ sont deux symboles du C++ dont la signification dépend du contexte dans lequel ils sont utilisés. Avec un peu de pratique, cette distinction devient rapidement naturelle. Passage par référence constante Dans de nombreux cas, une fonction doit simplement consulter les informations d’une structure sans les modifier. Le passage par référence constante permet d’éviter une copie tout en garantissant que la fonction ne pourra pas modifier la variable du programme appelant.
AccueilChapitre 10 – Passage des paramètres à une fonction void afficher(const Date& d) std::cout << d.jour << « / » << d.annee << std::endl; Date aujourdHui = {31, 7, 2026}; afficher(aujourdHui); Program ended with exit code: 0 Fig. 2 – Le compilateur vérifie que les règles du langage C++ sont respectées. Toute tentative de modifier une référence constante est détectée lors de la compilation, avant même que le programme ne soit exécuté. • Le passage par référence constante permet de consulter un objet sans le copier et sans risquer de le • Cette méthode est généralement recommandée lorsqu’une fonction doit uniquement lire les informations contenues dans un objet. • Le passage par référence constante est particulièrement adapté aux objets volumineux qui ne doivent pas être modifiés. • Il évite la création d’une copie tout en protégeant la variable du programme appelant contre toute modification accidentelle. • Le mot-clé const permet au programmeur d’exprimer clairement son intention. Le compilateur vérifie ensuite que cette intention est respectée. • Pourquoi utiliser const alors que je sais déjà que je ne vais pas modifier le paramètre ? Parce que le code est souvent relu, modifié et complété plusieurs mois ou plusieurs années après son écriture. En ajoutant const, le programmeur fournit une garantie au compilateur, qui vérifiera automatiquement que cette garantie est toujours respectée. • Le compilateur ne vérifie pas si la valeur de l’objet change. Il vérifie si le programme tente d’effectuer une écriture dans un objet déclaré constant. Dans le doute, si une fonction doit simplement consulter un objet, le passage par référence constante est souvent le meilleur choix.
AccueilChapitre 10 – Passage des paramètres à une fonction Passage par pointeur Comme une référence, un pointeur permet à une fonction d’agir directement sur la variable du programme appelant. La différence est que la fonction reçoit l’adresse de cette variable et non un alias. Le programme suivant illustre ce principe. void modifier(Date∗ d) // ou (∗d).annee = 2030 Date aujourdHui = {31, 7, 2026}; modifier(&aujourdHui); std::cout << aujourdHui.annee << std::endl; Program ended with exit code: 0 Le paramètre d est un pointeur. Il contient donc l’adresse de la variable aujourdHui. Pour appeler la fonction, il est nécessaire de transmettre cette adresse à l’aide de l’opérateur &. À l’intérieur de la fonction, l’opérateur −> permet d’accéder directement aux membres de la structure pointée. Le passage par pointeur est utilisé lorsque la fonction doit manipuler explicitement l’adresse d’un objet. Nous verrons plus loin que cette méthode est également indispensable pour les tableaux, les allocations dynamiques et certaines structures de données comme les listes chaînées et les arbres. Passage par référence Passage par pointeur Appel de la fonction Déclaration de la fonction Table 2 – Comparaison entre le passage par référence et le passage par pointeur.
AccueilChapitre 10 – Passage des paramètres à une fonction Tableau récapitulatif Mode de transmission Modifie l’original Passage par référence Passage par pointeur Paramètre de la fonction Table 3 – Comparaison des différents modes de transmission des paramètres. Mode de transmission Utilisation recommandée Types fondamentaux ou lorsqu’une copie indépendante est souhaitée. Passage par référence Lorsque la fonction doit modifier l’objet. Lorsque la fonction consulte un objet sans le modifier. C’est souvent le meilleur choix pour les objets volumineux. Passage par pointeur Lorsque la fonction manipule explicitement une adresse (tableaux, allocation dynamique, listes chaînées, arbres, objet éventuellement Table 4 – Choix du mode de transmission des paramètres. Le choix du mode de transmission d’un paramètre fait partie de la conception d’une fonction. Il n’existe pas de mode de transmission meilleur que les autres. Le choix dépend du rôle que doit jouer le paramètre dans la Le choix du mode de transmission d’un paramètre constitue une décision importante lors de la conception d’une Selon les besoins, il est possible de transmettre une copie de la variable, un alias de celle-ci ou encore son adresse mémoire. Chaque solution possède ses avantages et répond à un objectif bien précis. Le programmeur ne choisit donc pas un mode de transmission au hasard. Il choisit celui qui exprime le mieux le rôle que devra jouer le paramètre dans la fonction. Les tableaux récapitulatifs présentés à la fin de ce chapitre pourront servir de guide lors de l’écriture de nouvelles Une fonction bien conçue commence souvent par un bon choix de ses paramètres.
Accueilcpp-Chap10- Chapitre 10 – Passage des paramètres à une fonction
AccueilTermes à ajouter au glossaire