Qu'est-ce que l'opérateur de flèche (->
) un synonyme pour?
Les deux expressions suivantes sont équivalentes:
a->b
(*a).b
(sujet à la surcharge de l'opérateur, comme le mentionne Konrad, mais c'est inhabituel).
a->b
Est généralement un 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 .
Se liait plus fort et était exécuté en premier . Ceci est donc équivalent à *(a.b)
.
Méfiez-vous des surcharges, cependant: étant donné que les deux ->
Et *
Peuvent être surchargés, leur signification peut être radicalement différente.
Le langage C++ définit l’opérateur de flèche (->
) comme synonyme pour déréférencer un pointeur puis utiliser le .
_ 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'objet, vous déréférenciez le pointeur et effectuez un appel de méthode à cette adresse:
(*aPointer).method();
Ce qui pourrait être écrit avec l'opérateur de flèche:
aPointer->method();
La raison principale 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 aussi facile d’oublier les parenthèses entourant le déréférencement du pointeur. Si vous avez oublié les parenthèses, l'opérateur. Liera plus fort que l'opérateur * et fera exécuter notre exemple comme suit:
*(aPointer.method()); // Not our intention!
Une autre réponse a également mentionné à la fois que les opérateurs C++ peuvent être surchargés et que ce n'est pas si courant.
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 ..."
Je le lis surtout de droite à gauche et appelle "in"
foo->bar->baz = qux->croak
devient:
"baz in bar in foo devient croak in qux."
->
Est utilisé lors de l'accès à des données pour 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 ensuite utiliser une fonction, telle que foo, uniquement en déréférencant ce pointeur - pour appeler la fonction sur la variable pointée par le pointeur, plutôt que sur la valeur numérique de l'emplacement de mémoire de cette variable:
(*ptr).foo();
Sans les parenthèses, le compilateur comprendrait ceci comme *(ptr.foo())
en raison de la priorité des opérateurs, ce qui n'est pas ce que nous voulons.
C'est en fait la même chose que de taper
ptr->foo();
Comme le ->
Déréférence ce pointeur, il appelle donc la fonction foo()
sur la variable sur 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;
Vous pouvez utiliser -> pour définir une fonction.
auto fun() -> int
{
return 100;
}
Ce n'est pas un lambda. C'est vraiment une fonction. "->" indique le type de retour de la fonction.