À quoi sert l'opérateur flèche ( ->
)?
À quoi sert l'opérateur flèche ( ->
)?
Réponses:
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).
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.
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
:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
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:
(*aPointer).method();
Ce qui pourrait être écrit avec l'opérateur flèche:
aPointer->method();
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:
*(aPointer.method()); // Not our intention!
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.
new SomeClass()
renvoie un pointeur ( SomeClass *
), pas l' SomeClass
objet. Et vous commencez par déclarer anObject
et aPointer
mais vous utilisez p
ensuite.
En C ++ 0x, l'opérateur obtient une seconde signification, indiquant le type de retour d'une fonction ou d'une expression lambda
auto f() -> int; // "->" means "returns ..."
::
est en fait un opérateur, comme .
ou ->
, et est appelé "opérateur de résolution de portée" dans la norme.
->
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:
int* prt = &intVar;
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:
(*ptr).foo();
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
ptr->foo();
Comme les ->
déréférences ce pointeur, et ainsi appelle la fonction foo()
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:
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
->
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.