Definition de fonction avec un & ??? [C++] - C++ - Programmation
Marsh Posté le 15-05-2002 à 10:49:23
Parce qu'en c++ ce ne sont plus des pointeurs mais des references. Ca fait la meme chose qu'un pointeur sauf qu'a l'appel de ta fct, tu n'es pas oblige de passer l'adresse de la variable.
Marsh Posté le 15-05-2002 à 10:59:53
try58 a écrit a écrit : Parce qu'en c++ ce ne sont plus des pointeurs mais des references. Ca fait la meme chose qu'un pointeur sauf qu'a l'appel de ta fct, tu n'es pas oblige de passer l'adresse de la variable. |
Bah non c pas la même chose qu'un pointeur.
Le pointeurs ça existe encore en C++.
Un passage par référence, c transparent. C à dire qu'a part dans la définition de la fonction (ou le & succède au type du paramètre), tout ce passe comme pour un passage de paramètre par copie:
on passe le paramètre (pas l'adresse du paramètre) à la fonction.
on récupère le paramètre (et pas un pointeur vers la paramètre).
Marsh Posté le 15-05-2002 à 11:00:25
ok je vois mieux et si j'ai bien compris j'appelle ma fonction ma_fonction(parametre) et dans ma fonction je fais comment ?
pour modifier la valeur de parametre, je peux faire :
parametre=5 ??
et je peux changer la reference ?
comme ca : ¶metre= &autre_parametre ??
et ca marche avec quels types de variables ? uniquement les objets ?
merci......
[jfdsdjhfuetppo]--Message édité par ezzz le 15-05-2002 à 11:18:01--[/jfdsdjhfuetppo]
Marsh Posté le 15-05-2002 à 16:57:31
Une référence c pas tout à fait comme un pointeur. En effet t uest sûr que au bout de ta référence tu as une variable (sauf vraiment à le faire exprès) alors que le pointeur tu peux avoir n'importe quoi.
Marsh Posté le 15-05-2002 à 17:35:18
en fait le truc tout con a se dire pour comprendre
c'est que la reference n'est pas un pointeur
"c'est l'objet lui-meme".
Ainsi
Code :
|
Toute modif de reftoto va se repercuter sur toto tout simplement parce que reftoto EST toto et vice et versa, ce n'est pas un pointeur ou je ne sais quoi d'autre c'est un simple renommage (un synonyme ou un alias).
Quel est l'utilité ici? Dans l'exemple ci-dessus a pas grand chose mais en fait vous pouvez vous dire que ca sert a etendre le scope (la portée) d'une déclaration.
Je vais tenter d'expliquer par un exemple : en C/C++, tu as deux portées la portée d'allocation et la portée de déclaration, exemple une variable membre d'une classe a la durée de vie d'une instance de cette classe mais s'il est privé, seule une methode de la classe peut l'adresser par son nom. Pour y accéder, il faut un accesseur qui renverra soit un pointeur soit une reference vers cet objet. L'utilisation d'un pointeur ne se justifie pas si la variable membre n'est pas un pointeur lui-meme et de toute facon il sera suivi d'un deferencement (par *) inutile. Ce qu'on fait c'est qu'on déclare localement la ou l'on veut utiliser et modifier la variable originale une reference, un alias, qui désignera simplement la variable d'origine.
Exemple:
Code :
|
C'est du bon sens mais une reference ne peut designer un objet qui n'est plus valide (s'il a ete desalloué).
Erreur classique: on renvoie une reference d'un objet alloué sur la pile. Ou dans l'exemple ci dessus, si on fait un delete fooInstance; aliastoto devient invalide.
J'espere que ca aura un peu eclairé le monde sur ce qu'est une reference.
LEGREG
Marsh Posté le 16-05-2002 à 14:16:44
moi en fait ce qui me gene le plus c'est la difference qu'il y a entre l'objet lui meme et sa reference vu que ca s'ecrit pareil.
Sur ton exemple :
[...]
int & getToto(bool _boolIndex) {
if (_boolIndex)
return m_toto1;
else
return m_toto2;
}
ta methode getToto renvoie une reference, mais pourtant tu fais un return m_toto1 (ou 2)
c'est quoi la difference avec une fonction int getToto(bool _boolIndex) qui renverrait qu'un int ??
Marsh Posté le 16-05-2002 à 14:51:35
Comme je te le disais, la reference n'est pas une copie
donc tu peux modifier directement la valeur de fooInstance->m_toto1
de plus comme elle n'a pas d'allocation spécifique, tu es
obligé de renvoyer une variable dont la valeur a un sens
a la sortie de la fonction, pas de reference vers des objets
alloués sur la pile par ta fonction par exemple.
alors que si tu ecris:
Code :
|
Ce que tu renvoies c'est une "copie" de la valeur
de chacun des membres. Pour etre utilisée cette
copie doit être copiée a nouveau dans une variable locale a l'appel de fonction:
Code :
|
Mais seule la valeur de copieToto1 est modifiee.
La valeur de fooInstance->m_toto1 n'est pas modifiee !
copieToto1 et fooInstance->m_toto1 sont donc totalement
libres d'exister chacune de leur coté et ont le plus
souvent des valeurs différentes.
C'est la meme chose si tu passes un argument par reference.
Code :
|
ce bout de code va incrementer ta variable passée par référence.
tandis que :
Code :
|
ne va rien faire du tout. (il va copier la valeur de ta variable dans une variable temporaire. Va incrementer cette copie et va jeter le resultat.)
LEGREG
[jfdsdjhfuetppo]--Message édité par legreg le 16-05-2002 à 14:52:07--[/jfdsdjhfuetppo]
Marsh Posté le 16-05-2002 à 15:16:08
Merde legreg avec tes explications on dirait un pointeur ??
void inc(int *value) {
++value;
}
T'appelles inc(&value) et ca donne la meme chose.
[jfdsdjhfuetppo]--Message édité par Godbout le 16-05-2002 à 15:16:45--[/jfdsdjhfuetppo]
Marsh Posté le 16-05-2002 à 15:20:40
t'as oublié le *
++(*pointerToValue);
sinon ca ne fait pas la meme chose.
Effectivement tout peut se faire avec des pointeurs
SAUF que tu n'es pas garanti que le pointerToValue
est un pointeur valide!
Et tu es obligé de faire une operation de deferencement:
(*pointerToValue) pour manipuler ton entier.
En fait le pointeur est une maniere "detournée" de manipuler des alias et des references!
LEGREG
Marsh Posté le 16-05-2002 à 15:22:52
evidemment c'est comme ca que fait une generation
entiere de programmeurs C et ca se justifie dans certains
cas. Mais bon, la question originale c'etait "c'est quoi une reference en C++?".
LEGREG
Marsh Posté le 16-05-2002 à 15:29:41
Et c'est vraiment utile tout ca ?
Parce que pour l'instant je programme mais j'ai l'impression d'etre un peu sagouin sur les bords
Marsh Posté le 16-05-2002 à 15:43:12
Godbout a écrit a écrit : Et c'est vraiment utile tout ca ? Parce que pour l'instant je programme mais j'ai l'impression d'etre un peu sagouin sur les bords |
Bah si tu sais te servir des pointeurs, t'as pas besoin de références.
Perso je trouve juste ça plus joli !
Marsh Posté le 16-05-2002 à 15:50:45
el_gringo a écrit a écrit : Bah si tu sais te servir des pointeurs, t'as pas besoin de références. Perso je trouve juste ça plus joli ! |
bon ben les pointeurs ca va c'est cool
Mais bon je vais quand meme tacher de bouquiner un livre de C++ quand meme
Marsh Posté le 16-05-2002 à 16:20:04
el_gringo a écrit a écrit : Bah si tu sais te servir des pointeurs, t'as pas besoin de références. Perso je trouve juste ça plus joli ! |
bien sur que si, si tu programmes un peu en C++
connaitre les references ca vient avant le reste
(les templates et l'heritage virtuel) mais c'est subjectif bien entendu.
LEGREG
Marsh Posté le 16-05-2002 à 16:35:06
ca y est ca commence a venir
et je suppose que ca se rapproche des références en Java, non ? Pq la je maitrise 100 fois mieux...
Et dans mon cas les seuls bouquins de c++ que je peux avoir sont en allemand alors merci internet
Marsh Posté le 16-05-2002 à 16:40:15
non les variables en java c'est malheureusement legerement different: ce sont des objets a part entiere qui ont la possibilité d'etre nil (comme un pointeur en C) et qui comptent automatiquement les "references".
Je sais c'est perturbant..
LEGREG
Marsh Posté le 15-05-2002 à 10:27:35
J'aimerai savoir ce que signifie cette definition de fonction :
void ma_classe::ma_fonction( & parametre) {
}
pourquoi met on un & devant le parametre alors que normalement on met une * pour dire que le parametre est un pointeur ?
Merci pour votre aide...
---------------
mon flick r - 23 - https://youtu.be/LAr6oAKieHk