[C++] Definition de fonction avec un & ???

Definition de fonction avec un & ??? [C++] - C++ - Programmation

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
Reply

Marsh Posté le 15-05-2002 à 10:27:35   

Reply

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.

Reply

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

Reply

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]


---------------
mon flick r - 23 - https://youtu.be/LAr6oAKieHk
Reply

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.


---------------
Le Tyran
Reply

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 :
  1. int toto = 3;
  2. int &reftoto = toto;


 
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 :
  1. class foo{
  2. private:
  3.   int m_toto1;
  4.   int m_toto2;
  5. public:
  6.   int & getToto(bool _boolIndex) {
  7.     if (_boolIndex)
  8.       return m_toto1;
  9.     else
  10.       return m_toto2;
  11.   }
  12. }
  13. //quelques lignes plus loin
  14. int & aliastoto = fooInstance->getToto(true);
  15. // Ici on peut utiliser et modifier fooInstance.m_toto1


 
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

Reply

Marsh Posté le 16-05-2002 à 14:16:44    

:jap:  
 
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 ?? :??:

Reply

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 :
  1. int getValueToto(bool _boolIndex) {
  2.   if (_boolIndex) {
  3.     return m_toto1; 
  4.   } else {
  5.     return m_toto2;
  6.   }
  7. }


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 :
  1. int copieToto1 = fooInstance->getValueToto(true);
  2. copieToto1++;


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 :
  1. void inc(int & alias) {
  2.    ++alias;
  3. }


ce bout de code va incrementer ta variable passée par référence.
tandis que :

Code :
  1. void inc(int value) {
  2.   ++value;
  3. }


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]

Reply

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]


---------------
Super.
Reply

Marsh Posté le 16-05-2002 à 15:20:40    

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

Reply

Marsh Posté le 16-05-2002 à 15:20:40   

Reply

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

Reply

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


---------------
Super.
Reply

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 ! :D

Reply

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 ! :D  




 
bon ben les pointeurs ca va c'est cool :D
 
Mais bon je vais quand meme tacher de bouquiner un livre de C++ quand meme :D


---------------
Super.
Reply

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 ! :D  




 
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

Reply

Marsh Posté le 16-05-2002 à 16:35:06    

ca y est ca commence a venir :D
 
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 :cry: alors merci internet :D


---------------
mon flick r - 23 - https://youtu.be/LAr6oAKieHk
Reply

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

Reply

Sujets relatifs:

Leave a Replay

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