Quelle est la différence entre l'opérateur point (.) et -> en C++?
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...
Quelle est la différence entre l'opérateur point (.) et -> en C++?
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++?
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...
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é.
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 ->
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
.
@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'
.
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.