136 votes

Que puis-je utiliser à la place de l'opérateur flèche, `->` ?

Qu'est-ce que l'opérateur flèche ( -> ) un synonyme de ?

177voto

Greg Hewgill Points 356191

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).

10 votes

Les problèmes de surcharge sont beaucoup moins inhabituels que vous ne le pensez. Il n'y a pas si longtemps, les implémenteurs de la STL ne disposaient d'aucune surcharge -> pour certains types d'itérateurs, de sorte que vous avait à 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 exact.

1 votes

Vous pouvez également faire a[0].b au lieu de (*a).b . Mais il ne serait pas aussi bien structuré.

5 votes

Après de nombreuses années de programmation en c#, revenir au c++ n'est pas seulement une épreuve cognitive, la syntaxe c++ est tout simplement moche et dégueulasse. J'ai envie de prendre une douche après l'avoir utilisée. Les programmes écrits en c et c++ ne font qu'encourager la mauvaise programmation. Apple, avant Unix, a lutté pour rendre le langage aussi joli que le Pascal.

74voto

Konrad Rudolph Points 231505

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 parce que . se lie plus fortement et est exécuté en premier. Ceci est donc équivalent à *(a.b) .

Attention toutefois à la surcharge : Puisque les deux -> et * peuvent être surchargés, leur signification peut varier radicalement.

2 votes

Par binding strength vous voulez dire la préséance de l'opérateur ? si non, quelle est la différence entre les deux ?

2 votes

@Vizkrig Oui, les deux termes sont utilisés de manière interchangeable (bien que la "précédence de l'opérateur" semble être beaucoup plus fréquente, du moins ces dernières années).

47voto

P-A Points 2026

Le langage C++ définit l'opérateur flèche ( -> ) comme synonyme de déréférencement d'un pointeur, puis utiliser la fonction . -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 de l'objet, il faut déréférencer le pointeur et appeler une méthode à 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 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 oubliez les parenthèses, l'opérateur .- se liera plus fortement que l'opérateur * et fera en sorte que notre exemple s'exécute comme suit :

*(aPointer.method()); // Not our intention!

D'autres réponses ont également mentionné que les opérateurs C++ peuvent être surchargés et que ce n'est pas si courant.

8 votes

new SomeClass() renvoie un pointeur ( SomeClass * ), et non le SomeClass objet. Et vous commencez par déclarer anObject et aPointer mais vous utilisez p après.

0 votes

Dans l'ensemble, cette explication est théoriquement très juste, seul le changement d'objet la rend un peu alambiquée. Mais le processus est mieux décrit

19voto

En C++0x, l'opérateur a une deuxième signification, indiquant le type de retour d'une fonction ou d'une expression lambda.

auto f() -> int; // "->" means "returns ..."

1 votes

Techniquement, il ne s'agit plus d'un "opérateur", ou si ?

6 votes

Martin, la plupart des gens utilisent le mot "opérateur" pour de nombreuses choses qui ne sont pas directement utilisées pour calculer des valeurs. Comme pour ": :" ("scope operator"). Je ne sais pas quel est le point de vue de la norme sur ce sujet, exactement. Dans un sens abstrait, on pourrait voir "->" comme un opérateur fonctionnel faisant correspondre une séquence de types (paramètres) à un type de retour, comme l'opérateur haskell, qui s'écrit aussi "->".

2 votes

@JohannesSchaub-litb : :: est en fait un opérateur, comme . ou -> et est appelé "opérateur de résolution du champ d'application" dans la norme.

13voto

Tetha Points 2570

Je le lis surtout de droite à gauche et j'appelle "in".

foo->bar->baz = qux->croak

devient :

"baz in bar in foo devient croak in qux."

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