Passer par référence
Résolu/Fermé
Utilisateur anonyme
-
Modifié le 24 oct. 2018 à 11:38
Jithel Messages postés 843 Date d'inscription mercredi 20 juin 2018 Statut Membre Dernière intervention 31 août 2021 - 24 oct. 2018 à 14:37
Jithel Messages postés 843 Date d'inscription mercredi 20 juin 2018 Statut Membre Dernière intervention 31 août 2021 - 24 oct. 2018 à 14:37
A voir également:
- Passer par référence
- Reference pto - Accueil - Box & Connexion Internet
- Passer de windows 7 à windows 10 - Accueil - Mise à jour
- Passer de qwerty a azerty - Guide
- Passer de majuscule à minuscule - Guide
- Passer en root debian ✓ - Forum Debian
3 réponses
Jithel
Messages postés
843
Date d'inscription
mercredi 20 juin 2018
Statut
Membre
Dernière intervention
31 août 2021
171
Modifié le 24 oct. 2018 à 11:32
Modifié le 24 oct. 2018 à 11:32
Effectivement, tu obtiendra les mêmes résultats avec et sans les &. Cependant, passer par référence économise des ressources. En effet, sans passage par référence, les variables sont copiées puis détruites à la fin de la fonction. Avec passage par référence, les variables en paramètre sont celles qui sont définies en dehors de la fonction donc elles ne sont ni créées ni détruites. Cependant, elles peuvent être modifiées au sein de la fonction (attention).
En particulier, si dans ta fonction moyenne avec les &, tu modifies la valeur de x ou y alors la variable note1 ou note2 sera modifiée. Alors que sans les &, la modification ne sera pas effectuée.
Source :
https://fr.wikibooks.org/wiki/Programmation_C-C%2B%2B/Passage_de_paramètres_par_variable_ou_par_valeur
Notamment :
Il est recommandé, pour des raisons de performances, de passer par référence tous les paramètres dont la copie peut prendre beaucoup de temps (en pratique, seuls les types de base du langage pourront être passés par valeur). Bien entendu, il faut utiliser des références constantes au maximum afin d'éviter les modifications accidentelles des variables de la fonction appelante dans la fonction appelée. En revanche, les paramètres de retour des fonctions ne devront pas être déclarés comme des références constantes, car on ne pourrait pas les écrire si c'était le cas.
En particulier, si dans ta fonction moyenne avec les &, tu modifies la valeur de x ou y alors la variable note1 ou note2 sera modifiée. Alors que sans les &, la modification ne sera pas effectuée.
Source :
https://fr.wikibooks.org/wiki/Programmation_C-C%2B%2B/Passage_de_paramètres_par_variable_ou_par_valeur
Notamment :
Il est recommandé, pour des raisons de performances, de passer par référence tous les paramètres dont la copie peut prendre beaucoup de temps (en pratique, seuls les types de base du langage pourront être passés par valeur). Bien entendu, il faut utiliser des références constantes au maximum afin d'éviter les modifications accidentelles des variables de la fonction appelante dans la fonction appelée. En revanche, les paramètres de retour des fonctions ne devront pas être déclarés comme des références constantes, car on ne pourrait pas les écrire si c'était le cas.
Utilisateur anonyme
24 oct. 2018 à 11:34
24 oct. 2018 à 11:34
Bonjour
PS en utilisant bien la coloration, comme décrit ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code , c'est plus lisible non?
#include<iostream> using namespace std; #include<cmath> double moyenne(double& x, double& y) { return (x+y)/2;//ici le return sert à donner au code appelant le résultat de ton opération, y'a pas d'histoire de référence avec return //comme tu ne modifies pas x et y le passage par référence sert à économiser de la mémoire, en effet, tu ne copies pas le contenue des valeurs dans 2 nouveaux espaces mémoires. } int main() { double note1(0.0), note2(0.0); cout <<" entrez vos deux notes " << endl; cin >> note1>>note2; cout <<" votre moyenne est " << moyenne(note1,note2)<< endl;//ici tu affiches le résultat renvoyé return 0; }
PS en utilisant bien la coloration, comme décrit ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code , c'est plus lisible non?
Utilisateur anonyme
24 oct. 2018 à 14:03
24 oct. 2018 à 14:03
Merci de ta réponse mais avec la fonction m1 et m2 si dans m1 je supprime le &
j’obtiens 35 35 35 alors que si je laisse le& j’obtiens 35 35 53
Alors que dans le deuxième exemple sur le calcul de la moyenne & ou pas cela ne change rien
Donc quand j’écris du code et une fonction comment savoir quoi faire et quel choix faire & ou pas & avec toutes les explications que je peux lire je n’arrive pas à comprendre
Quelq’un aurait il une explication qui me permette de comprendre
Cordialement
j’obtiens 35 35 35 alors que si je laisse le& j’obtiens 35 35 53
Alors que dans le deuxième exemple sur le calcul de la moyenne & ou pas cela ne change rien
Donc quand j’écris du code et une fonction comment savoir quoi faire et quel choix faire & ou pas & avec toutes les explications que je peux lire je n’arrive pas à comprendre
Quelq’un aurait il une explication qui me permette de comprendre
Cordialement
Jithel
Messages postés
843
Date d'inscription
mercredi 20 juin 2018
Statut
Membre
Dernière intervention
31 août 2021
171
Modifié le 24 oct. 2018 à 14:37
Modifié le 24 oct. 2018 à 14:37
Dans la fonction avec m1 et m2 :
Alors que la fonction moyenne :
Voilà la différence entre le premier exemple et le deuxième.
En ce qui concerne pourquoi dans le deuxième ça change rien :
équivaut à
Alors que
équivaut à
void m1(int i, int j) { int tmp(i); i = j; // paramètre i modifié j = tmp; // paramètre j modifié } void m2(int& i, int& j) { int tmp(i); i = j; // paramètre i modifié j = tmp; // paramètre j modifié }
Alors que la fonction moyenne :
double moyenne(double& x, double& y) { // paramètres x et y non modifié return (x+y)/2; }
Voilà la différence entre le premier exemple et le deuxième.
En ce qui concerne pourquoi dans le deuxième ça change rien :
double moyenne(double& x, double& y) { // paramètres x et y non modifié return (x+y)/2; } double note1(0.0), note2(0.0); moyenne(note1, note2);
équivaut à
double note1(0.0), note2(0.0); (note1+note2)/2
Alors que
double moyenne(double x, double y) // pas de & { // paramètres x et y non modifié return (x+y)/2; } double note1(0.0), note2(0.0); moyenne(note1, note2);
équivaut à
double note1(0.0), note2(0.0); double x = note1; double y = note2; (x+y)/2;