Passer par référence
Résolu
Utilisateur anonyme
-
Jithel Messages postés 843 Date d'inscription Statut Membre Dernière intervention -
Jithel Messages postés 843 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
ce petit code :
affiche 35 35 53
d'accord , on utilise & pour passer par référence
mais celui là:
affiche la bonne réponse mais si on définie la fonction par : double moyenne(double x, double y) sans les & donc pas par référence cela donne le même résultat
ma question est : je croyais avoir compris le passage par référence ou pas mais apparemment je n'ai rien compris
quelqu' un peut il m'expliquer
à l'avance merci
ce petit code :
void m1(int i, int j) { int tmp(i); i = j; j = tmp; } void m2(int& i, int& j) { int tmp(i); i = j; j = tmp; } int main() { int x(3), y(5); cout << x << y << " "; m1(x, y); cout << x << y << " "; m2(x, y); cout << x << y << endl; return 0; }
affiche 35 35 53
d'accord , on utilise & pour passer par référence
mais celui là:
#include<iostream> using namespace std; #include<cmath> double moyenne(double& x, double& y) { return (x+y)/2; } 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; return 0; }
affiche la bonne réponse mais si on définie la fonction par : double moyenne(double x, double y) sans les & donc pas par référence cela donne le même résultat
ma question est : je croyais avoir compris le passage par référence ou pas mais apparemment je n'ai rien compris
quelqu' un peut il m'expliquer
à l'avance merci
A voir également:
- Passer par référence
- Passer de qwerty a azerty - Guide
- Reference pto - Accueil - Box & Connexion Internet
- Passer a windows 10 - Accueil - Mise à jour
- Passer de majuscule à minuscule - Guide
- Passer à windows 11 gratuitement - Guide
3 réponses
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.
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?
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
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;