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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°139088
ezzz
23
Posté le 15-05-2002 à 10:27:35  profilanswer
 

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
mood
Publicité
Posté le 15-05-2002 à 10:27:35  profilanswer
 

n°139117
try58
Posté le 15-05-2002 à 10:49:23  profilanswer
 

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.

n°139125
El_gringo
Posté le 15-05-2002 à 10:59:53  profilanswer
 

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

n°139126
ezzz
23
Posté le 15-05-2002 à 11:00:25  profilanswer
 

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
n°139378
LetoII
Le dormeur doit se réveiller
Posté le 15-05-2002 à 16:57:31  profilanswer
 

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
n°139418
LeGreg
Posté le 15-05-2002 à 17:35:18  profilanswer
 

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

n°139828
ezzz
23
Posté le 16-05-2002 à 14:16:44  profilanswer
 

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

n°139871
LeGreg
Posté le 16-05-2002 à 14:51:35  profilanswer
 

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]

n°139899
godbout
Génial.
Posté le 16-05-2002 à 15:16:08  profilanswer
 

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.
n°139903
LeGreg
Posté le 16-05-2002 à 15:20:40  profilanswer
 

: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

mood
Publicité
Posté le 16-05-2002 à 15:20:40  profilanswer
 

n°139906
LeGreg
Posté le 16-05-2002 à 15:22:52  profilanswer
 

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

n°139913
godbout
Génial.
Posté le 16-05-2002 à 15:29:41  profilanswer
 

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.
n°139921
El_gringo
Posté le 16-05-2002 à 15:43:12  profilanswer
 

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

n°139926
godbout
Génial.
Posté le 16-05-2002 à 15:50:45  profilanswer
 

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.
n°139937
LeGreg
Posté le 16-05-2002 à 16:20:04  profilanswer
 

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

n°139945
ezzz
23
Posté le 16-05-2002 à 16:35:06  profilanswer
 

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
n°139947
LeGreg
Posté le 16-05-2002 à 16:40:15  profilanswer
 

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


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

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

 

Sujets relatifs
ASP : RE-recupérer la valeur que renvoi une fonctionASP - recupérer la valeur que renvoit une fonction
[Delphi] Fermer un service : fonction CloseServiceHandle & coProblème avec la fonction qsort() en langage C !
[javascript] fonction onChange=onBlur ?les fonction en c
[PHP] fonction copy[C] fonction GETOPT
[JS]comprend pas certaine fonction, code inside[C/C++] Comment fonctionne la fonction "free" ?
Plus de sujets relatifs à : [C++] Definition de fonction avec un & ???


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