343 votes

Quelle est la différence entre l'opérateur point (.) et -> en C++?

Quelle est la différence entre l'opérateur point (.) et -> en C++?

349voto

SwDevMan81 Points 22634

foo->bar() est la même chose que (*foo).bar().

Les parenthèses ci-dessus sont nécessaires en raison de la force de liaison des opérateurs * et ..

*foo.bar() ne fonctionnerait pas car l'opérateur Point (.) est évalué en premier (voir précédence des opérateurs).

L'opérateur Point (.) ne peut pas être surchargé, l'opérateur fléché (->) peut être surchargé.

L'opérateur Point (.) ne peut pas être appliqué aux pointeurs.

Voir aussi : Quel est le synonyme de l'opérateur fléché (->) en C++?

5 votes

Notez que cela ne s'applique qu'aux pointeurs bruts. Pour les types de classe qui surchargent l'opérateur, ils ont d'autres propriétés intéressantes...

0 votes

Ne vous dérange-t-il pas que -> soit un opérateur de déduction, et donc s'il est surchargé, il n'est pas équivalent à membre de l'objet derefenced (*boo).foo ? comme si boo->foo peut être surchargé pour renvoyer un objet intermédiaire proxy qui a un membre foo différent de celui de la classe d'origine. Ne serait-il pas vrai que l'assertion( (*boo).foo == boo->foo ) échouera. Il est vrai qu'il faut être prudent car les lutins c++ peuvent rôder dans l'obscurité.

74voto

Gordon Gustafson Points 14778

Pour un pointeur, nous pourrions simplement utiliser

*pointervariable.foo

Mais l'opérateur . a une précédence plus grande que l'opérateur *, donc . est évalué en premier. Nous devons donc forcer cela avec des parenthèses :

(*pointervariable).foo

Mais taper les () tout le temps est difficile, donc ils ont développé -> comme raccourci pour dire la même chose. Si vous accédez à une propriété d'un objet ou d'une référence d'objet, utilisez .. Si vous accédez à une propriété d'un objet via un pointeur, utilisez ->

61voto

Tadeusz Kopec Points 7625

L'opérateur point ne peut pas être surchargé, l'opérateur fléché peut être surchargé. L'opérateur fléché est généralement destiné à être appliqué aux pointeurs (ou aux objets qui se comportent comme des pointeurs, comme les pointeurs intelligents). L'opérateur point ne peut pas être appliqué aux pointeurs.

MODIFIER Lorsqu'il est appliqué à un pointeur, l'opérateur fléché est équivalent à l'application de l'opérateur point au pointé par exemple ptr->champ est équivalent à (*ptr).champ.

1 votes

Bien que l'opérateur d'indirection (*foo) puisse être surchargé

32voto

L'opérateur de flèche est similaire au point, sauf qu'il déréférence d'abord un pointeur. foo.bar() appelle la méthode bar() sur l'objet foo, foo->bar appelle la méthode bar sur l'objet pointé par le pointeur foo.

1 votes

Et si la chose n'est pas un pointeur ?

0 votes

@juanchopanza Si foo n'est pas un pointeur et est de type MyType, vous obtiendrez une exception de compilation : base operand of '->' has non-pointer type 'MyType'.

0 votes

@horcrux C++ permet de surcharger l'opérateur operator->.

14voto

Tamás Szelei Points 8660
pQuelqueChose->someMember

est équivalent à

(*pQuelqueChose).someMember

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X