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
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

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
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.
Whismeril Messages postés 19099 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 23 juillet 2024 917
24 oct. 2018 à 11:34
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?
Utilisateur anonyme
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
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
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;
0