Passage par valeur ou par reference??? - C++ - Programmation
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.
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 :
|
Et voilà ce que ce programme devrait sortir :
|
edit> Un peu lent...
Marsh Posté le 23-01-2003 à 15:49:01
BifaceMcLeOD, un revenant !
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é ...
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.
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
Marsh Posté le 23-01-2003 à 16:16:02
HelloWorld a écrit : BifaceMcLeOD, un revenant ! |
Hello-Hello, World!
Marsh Posté le 23-01-2003 à 16:35:36
HelloWorld a écrit : Moui, sauf que ton exemple n'est pas terrible. |
non c'est sur... mais des qu'on utilise autre chose qu'un type de base, on y gagne directement
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