Passer par référence [Résolu/Fermé]

Signaler
Messages postés
173
Date d'inscription
dimanche 20 juillet 2003
Statut
Membre
Dernière intervention
24 août 2020
-
Messages postés
840
Date d'inscription
mercredi 20 juin 2018
Statut
Membre
Dernière intervention
15 novembre 2019
-
Bonjour,
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

3 réponses

Messages postés
840
Date d'inscription
mercredi 20 juin 2018
Statut
Membre
Dernière intervention
15 novembre 2019
138
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.
Messages postés
15833
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 avril 2021
690
Bonjour

#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?
Messages postés
173
Date d'inscription
dimanche 20 juillet 2003
Statut
Membre
Dernière intervention
24 août 2020
5
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
Messages postés
840
Date d'inscription
mercredi 20 juin 2018
Statut
Membre
Dernière intervention
15 novembre 2019
138
Dans la fonction avec m1 et m2 :

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;