Passage par valeur ou par reference???

Passage par valeur ou par reference??? - C++ - Programmation

Marsh Posté le 23-01-2003 à 15:16:18    

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:

Reply

Marsh Posté le 23-01-2003 à 15:16:18   

Reply

Marsh Posté le 23-01-2003 à 15:38:39    

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
Reply

Marsh Posté le 23-01-2003 à 15:42:18    

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
Reply

Marsh Posté le 23-01-2003 à 15:49:01    

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
Reply

Marsh Posté le 23-01-2003 à 15:51:59    

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.

Reply

Marsh Posté le 23-01-2003 à 16:04:01    

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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 23-01-2003 à 16:16:02    

HelloWorld a écrit :

BifaceMcLeOD, un revenant ! ;) :hello:


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


Message édité par BifaceMcLeOD le 23-01-2003 à 16:16:24
Reply

Marsh Posté le 23-01-2003 à 16:35:36    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed