Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1012 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Passage par valeur ou par reference???

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Passage par valeur ou par reference???

n°292571
pomito
Qui ne tente rien n'a rien...
Posté le 23-01-2003 à 15:16:18  profilanswer
 

Voila je me pose une question (c'est pour mon partiel de demain):
Dans quel cas opter pour un passage par valeur ou par reference?
 
On ma dit:
PAR REFERENCE:Les valeurs sont sauvées( utiliser un pointeur)
PAR VALEUR:Les valeurs changent
Mais je ne comprends pas...
AIDEZ-MOI!!!
MERCI :hello:

mood
Publicité
Posté le 23-01-2003 à 15:16:18  profilanswer
 

n°292589
matafan
Posté le 23-01-2003 à 15:38:39  profilanswer
 

En gros il y a deux raisons qui peuvent te pousser à vouloir passer des paramêtres par références :
- Ton paramêtre est trop gros, il est plus économique de passer un pointeur vers ce paramêtre. C'est à la fois plus rapide puisque tu n'as pas à recopier toute ta structure dans la pile, est plus économique (ça prend sizeof(ma_struct *), soit 4 ou 8 suivant l'archi, au lieu de sizeof(ma_struct), qui peut être énoooorme).
- Tu veux pouvoir modifier, dans la fonction appelée, des variables utilisées dans la fonction appelante. Puisque tu passe un pointeur (l'adresse en mémoire de ton paramêtre), tu peux modifier la vrai valeur dans la fonction appelante.
 
Evidemment il faut faire gaffe à ne pas modifier par erreur une valeur passée en référence. Si on utilise un passage par référence pour raison d'économie seulement, on sera bien inspiré de mettre des "const" dans la déclaration de fonction, pour éviter les bêtises. On écrira donc void func(const mon_type_t *arg), qui évite de modifier par erreur la valeur pointée par arg (erreur à la compilation si c'est le cas).
 
Ca c'était du C, en C++ il y a un "sucre de syntaxe" qui fait qu'on peut faire du passage par référence sans rien faire de spécial au moment de l'appel (on appelle func(arg), on n'a pas à faire func(&arg)). C'est du vrai passage par référence, et personellement je trouve ça très confusionant puisqu'à l'appel on ne sait pas vraiment ce qu'on fait. Il faut aller voir la déclaration de la fonction pour savoir si le paramêtre est passé par valeur ou référence.


Message édité par matafan le 23-01-2003 à 15:41:06
n°292595
BifaceMcLe​OD
The HighGlandeur
Posté le 23-01-2003 à 15:42:18  profilanswer
 

Lors du passage par valeur, la valeur du paramètre est copiée. Donc si la fonction modifie la valeur de ce paramètre, cela ne modifie rien pour l'appelant.
Par contre, si le paramètre est passé par référence, toute modification de la valeur du paramètre est effective pour la fonction comme pour l'appelant.
 
Un petit exemple de code :

Code :
  1. void toto(int a)
  2. {
  3.   cout << " -- dans toto (debut): a = " << a << endl;
  4.   a = 2;
  5.   cout << " -- dans toto (fin)  : a = " << a << endl;
  6. }
  7. void titi(int& a)
  8. {
  9.   cout << " -- dans titi (debut): a = " << a << endl;
  10.   a = 3;
  11.   cout << " -- dans titi (fin)  : a = " << a << endl;
  12. }
  13. int main(void)
  14. {
  15.   int  n = 0;
  16.   cout << "Au debut:   n = " << n << endl;
  17.   toto(n);
  18.   cout << "Apres toto: n = " << n << endl;
  19.   titi(n);
  20.   cout << "Apres titi: n = " << n << endl;
  21.   return 0;
  22. }


 
Et voilà ce que ce programme devrait sortir :


Au debut:   n = 0
 -- dans toto (debut): a = 0
 -- dans toto (fin)  : a = 2
Apres toto: n = 0
 -- dans titi (debut): a = 0
 -- dans titi (fin)  : a = 3
Apres titi: n = 3


 
edit> Un peu lent...  :D


Message édité par BifaceMcLeOD le 23-01-2003 à 15:43:01
n°292610
HelloWorld
Salut tout le monde!
Posté le 23-01-2003 à 15:49:01  profilanswer
 

BifaceMcLeOD, un revenant ! ;) :hello:
 

Citation :

C'est du vrai passage par référence, et personellement je trouve ça très confusionant puisqu'à l'appel on ne sait pas vraiment ce qu'on fait. Il faut aller voir la déclaration de la fonction pour savoir si le paramêtre est passé par valeur ou référence.

 
 
Je suis d'accord avec toi que c'est assez confudant, mais pas en fait pas tellement plus qu'avec des pointeur ... avec les pointeurs aussi il faut aller voir la declaration pour savoir qu'il s'agit d'un pointeur qui est demandé ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°292615
Taz
bisounours-codeur
Posté le 23-01-2003 à 15:51:59  profilanswer
 

et si tu ne modifies pas le paramètre et que tu veux eviter la recopie parce qu'elle est inutile, utilise une const & ("const int &i" ) par exemple.

n°292624
HelloWorld
Salut tout le monde!
Posté le 23-01-2003 à 16:04:01  profilanswer
 

Moui, sauf que ton exemple n'est pas terrible.
Sur un int, ca apporte pas grand chose


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°292636
BifaceMcLe​OD
The HighGlandeur
Posté le 23-01-2003 à 16:16:02  profilanswer
 

HelloWorld a écrit :

BifaceMcLeOD, un revenant ! ;) :hello:


Hello-Hello, World!  :hello: ;)  :D


Message édité par BifaceMcLeOD le 23-01-2003 à 16:16:24
n°292663
Taz
bisounours-codeur
Posté le 23-01-2003 à 16:35:36  profilanswer
 

HelloWorld a écrit :

Moui, sauf que ton exemple n'est pas terrible.
Sur un int, ca apporte pas grand chose

non c'est sur... mais des qu'on utilise autre chose qu'un type de base, on y gagne directement


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Passage par valeur ou par reference???

 

Sujets relatifs
[débutant] affecter la valeur d'une cellule à une textbox ou label ?[php/MysqL] récuperer une valeur directement
Probleme de passage de VC++ 6.0 à BC++ 6.0Passage d'info entre frame niveau newbie avance :)
[PHP] Faire un test sur la valeur d'un paramètre du php.ini[php] probleme bizarre de passage de parametre
[PHP] Passage de variables dans l'URL impossible ???Récupérer le valeur d 1 variable
--> Probleme pour recupérer une valeur dans une liste ! HELP !!!!! <--passage de alink, vlink, link en CSS => pas le meme comportement :/
Plus de sujets relatifs à : Passage par valeur ou par reference???


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR