différence entre * et &

différence entre * et & - C++ - Programmation

Marsh Posté le 25-03-2008 à 12:31:09    

Salut je voudrais juste faire le point sur ça:
C'est quoi la différence entre les deux?
 

Code :
  1. class A
  2. {
  3. int x
  4. public:
  5. A(int * unx)
  6. };


 
 

Code :
  1. class A
  2. {
  3. int x
  4. public:
  5. A(int & unx)
  6. };


 
 
merci

Reply

Marsh Posté le 25-03-2008 à 12:31:09   

Reply

Marsh Posté le 25-03-2008 à 13:18:45    

dans le 1er code, tu transmet la valeur effective de unx, dans l'autre tu transmets son adresse (pointeur)

Reply

Marsh Posté le 25-03-2008 à 14:02:25    

ah. Je croyais que celui où on transmet l'adresse, c'etait avec *.
Ca apporte quoi de faire de la façon du 1er code?
Passer l'adresse (donc avec & ) je sais que ça fait gagner de l'espace mémoire, mais l'autre je sais pas...


Message édité par nebneblan le 25-03-2008 à 14:06:26
Reply

Marsh Posté le 25-03-2008 à 14:14:52    

Code :
  1. A(int unx)


passage par valeur, dans A tu as une copie de unx. Bon ca va c'est pas trop gros les int, mais sur un gros truc, la copie peut être lourde.
 

Code :
  1. A(int* unx)


idem (passage par valeur), mais ici unx est un int* (pointeur sur int). Dans A tu as donc une copie de ce int* (ce qui devrait te permettre d'accéder à l'int qui est derrière et qui n'a pas été copié).  
Si tu avais un truc plus gros qu'un int, copier un pointeur sur un gros truc c'est moins lourd que de copier le gros truc.
 

Code :
  1. A(int & unx)


dans A tu auras accès à unx car là tu as passé une référence (une adresse), et pas une copie (pas une copie d'int, pas une copie d'int*).  
A priori ca sera aussi "léger" que A(int* unx) mais pas besoin d'écrire qqchose de spécifique quand tu appelles A(x) (tu écris le même appel qu'avec A(int unx))
 
 :o


Message édité par Xavier_OM le 25-03-2008 à 14:20:33

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 25-03-2008 à 14:25:52    

Ok, merci
Mais au final, pour moi le & et * ça revient à la même chose alors... Si c'est juste que c'est un gain de mémoire dans les 2 cas. non ?

Reply

Marsh Posté le 25-03-2008 à 14:27:46    

non. La sémantique de la référence est différente de celle du pointeur.
Principalement, il n'existe pas de références ne référençant rien ( comme l pointeur NULL). Ensuite, les références constantes et références non-constantes ont des effets de bords non négligeable.
 
En c++, on est grand, on passe des références :o
Les pointeurs, suaf besoin bas niveau, sont à proscrire car non sécure.

Reply

Marsh Posté le 25-03-2008 à 14:29:21    

Mince, dans mon projet de prog je suis parti pour tout passer par pointeur...

Reply

Marsh Posté le 25-03-2008 à 14:34:51    

nebneblan a écrit :

Ok, merci
Mais au final, pour moi le & et * ça revient à la même chose alors... Si c'est juste que c'est un gain de mémoire dans les 2 cas. non ?

 

Quand tu utilises le passage par référence, tu as directement dans A() le "vrai" objet, pas un pointeur ou une copie. Normalement on dit :

Citation :

Utilisez les références quand vous pouvez, et les pointeurs quand vous devez.

 

Sur tes interfaces, tes méthodes public, utilise des références, histoire que les gens s'emmerdent pas à créer des pointeurs juste pour faire plaisir à tes méthodes.
Dans ta tambouille interne, si tu as besoin d'un pointeur, ben utilise le. L'un des trucs qui pourrait servir dans certains cas particuliers, c'est qu'on peut affecter NULL (zéro) au pointeur, mais bon :o

 


edit : grilled


Message édité par Xavier_OM le 25-03-2008 à 14:35:30

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Sujets relatifs:

Leave a Replay

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