À quoi sert l'opérateur flèche ( ->
)?
112
Les deux expressions suivantes sont équivalentes:
a->b
(*a).b
(sujet à une surcharge de l'opérateur, comme le mentionne Konrad, mais c'est inhabituel).
->
opérateur pour certains types de iterator de sorte que vous aviez à utiliser*.
. De nombreuses bibliothèques les définissent de manière incohérente. Cela devient vraiment ennuyeux lorsque vous travaillez avec des modèles et que vous ne connaissez pas le type précis.a[0].b
place de(*a).b
. Mais ce ne serait pas aussi bien structuré.a->b
est généralement synonyme de(*a).b
. Les parenthèses ici sont nécessaires en raison de la force de liaison des opérateurs*
et.
:*a.b
ne fonctionnerait pas car la liaison.
est plus forte et est exécutée en premier. C'est donc équivalent à*(a.b)
.Méfiez-vous de la surcharge, cependant: comme les deux
->
et*
peuvent être surchargés, leur signification peut différer radicalement.la source
binding strength
vous voulez dire la priorité des opérateurs? sinon quelle est la différence entre les deux?Le langage C ++ définit l'opérateur de flèche (
->
) comme synonyme de déréférencement d'un pointeur, puis utilise l'.
opérateur sur cette adresse.Par exemple:
Si vous avez un objet,
anObject
et un pointeur,aPointer
:Pour pouvoir utiliser l'une des méthodes d'objets, vous déréférencez le pointeur et effectuez un appel de méthode sur cette adresse:
Ce qui pourrait être écrit avec l'opérateur flèche:
La principale raison de l'existence de l'opérateur de flèche est qu'il raccourcit la saisie d'une tâche très courante et qu'il est également assez facile d'oublier les parenthèses autour du déréférencement du pointeur. Si vous avez oublié les parenthèses, l'opérateur.-Se liera plus fort que * -operator et fera exécuter notre exemple comme:
Certaines des autres réponses ont également mentionné à la fois que les opérateurs C ++ peuvent être surchargés et que ce n'est pas si courant.
la source
new SomeClass()
renvoie un pointeur (SomeClass *
), pas l'SomeClass
objet. Et vous commencez par déclareranObject
etaPointer
mais vous utilisezp
ensuite.En C ++ 0x, l'opérateur obtient une seconde signification, indiquant le type de retour d'une fonction ou d'une expression lambda
la source
::
est en fait un opérateur, comme.
ou->
, et est appelé "opérateur de résolution de portée" dans la norme.Je le lis principalement de droite à gauche et j'appelle "in"
devient:
"baz in bar in foo devient croak in qux."
la source
->
est utilisé lors de l'accès aux données sur lesquelles vous avez un pointeur.Par exemple, vous pouvez créer un pointeur ptr vers une variable de type int intVar comme ceci:
Vous pouvez alors utiliser une fonction, telle que foo, uniquement en déréférençant ce pointeur - pour appeler la fonction sur la variable vers laquelle pointe le pointeur, plutôt que sur la valeur numérique de l'emplacement mémoire de cette variable:
Sans les parenthèses ici, le compilateur comprendrait cela comme
*(ptr.foo())
dû à la priorité des opérateurs qui n'est pas ce que nous voulons.C'est en fait la même chose que de taper
Comme les
->
déréférences ce pointeur, et ainsi appelle la fonctionfoo()
sur la variable vers laquelle le pointeur pointe pour nous.De même, nous pouvons utiliser
->
pour accéder ou définir un membre d'une classe:la source
Vous pouvez utiliser -> pour définir une fonction.
Ce n'est pas un lambda. C'est vraiment une fonction. "->" indique le type de retour de la fonction.
la source