web-dev-qa-db-fra.com

Quelle est la différence entre l'opérateur point (.) Et -> en C ++?

Quelle est la différence entre l'opérateur point (.) Et -> en C++?

293
moorthy

foo->bar() est identique à (*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 Dot (.) est évalué en premier (voir priorité des opérateurs )

L'opérateur point (.) ne peut pas être surchargé, l'opérateur flèche (->) peut être surchargé.

L'opérateur Point (.) ne peut pas être appliqué aux pointeurs.

Voir aussi: Quel est l'opérateur de flèche (->) synonyme de C++?

298
SwDevMan81

Pour un pointeur, nous pourrions simplement utiliser

*pointervariable.foo

Mais l'opérateur . a une priorité supérieure à l'opérateur *, de sorte que . est évalué en premier. Nous devons donc forcer ceci avec des parenthèses:

(*pointervariable).foo

Mais il est difficile de taper tout le temps (), donc ils ont développé -> comme un raccourci pour dire la même chose. Si vous accédez à une propriété d'un objet ou à une référence d'objet, utilisez . Si vous accédez à une propriété d'un objet via un pointeur, utilisez ->

68
Gordon Gustafson

L'opérateur de point ne peut pas être surchargé, l'opérateur de flèche peut être surchargé. L'opérateur Arrow est généralement conçu pour être appliqué aux pointeurs (ou aux objets qui se comportent comme des pointeurs, comme des pointeurs intelligents). L'opérateur point ne peut pas être appliqué aux pointeurs.

EDIT Appliqué à l'opérateur de flèche de pointeur équivaut à appliquer l'opérateur de point à pointee (ptr-> champ est équivalent à (* ptr) .field)

55
Tadeusz Kopec

L'opérateur de flèche est comme un point, sauf qu'il déréférence d'abord un pointeur. foo.bar() appelle la méthode bar() sur un objet foo, foo->bar appelle la méthode bar sur un objet pointé par le pointeur foo.

29

L'opérateur . est destiné à un accès direct aux membres.

object.Field

La flèche déréférence un pointeur pour que vous puissiez accéder à l'objet/à la mémoire sur laquelle il pointe.

pClass->Field
14
Johannes Rudolph
pSomething->someMember

est équivalent à

(*pSomething).someMember
13
Tamás Szelei

La cible. dot travaille sur des objets; La flèche fonctionne sur les pointeurs d’objets.

std::string str("foo");
std::string * pstr = new std::string("foo");

str.size ();
pstr->size ();
10
ezpz

Utilisez -> lorsque vous avez un pointeur. Utilisez . lorsque vous avez une structure (classe).

Lorsque vous souhaitez pointer un attribut appartenant à une structure, utilisez .:

structure.attribute

Lorsque vous souhaitez pointer sur un attribut référencé en mémoire par un pointeur, utilisez ->:

pointer->method;

ou identique à:

(*pointer).method
6
Am1rr3zA

Notez que l'opérateur -> ne peut pas être utilisé pour certaines choses, par exemple, l'accès à l'opérateur [].

#include <vector>

int main()
{
   std::vector<int> iVec;
   iVec.Push_back(42);
   std::vector<int>* iVecPtr = &iVec;

   //int i = iVecPtr->[0]; // Does not compile
   int i = (*iVecPtr)[0]; // Compiles.
}
3
gparent

Le -> est simplement un sucre syntaxique pour un déréférencement de pointeur,

Comme d'autres l'ont dit:

pointeur-> méthode ();

est une méthode simple de dire:

(* pointeur) .method ();

Pour plus d’amusement de pointeur, consultez Binky et sa baguette magique de déréférencement:

http://www.youtube.com/watch?v=UvoHwFvAvQE

2
Ali Parr

C'est simple, chaque fois que vous voyez

 x->y

sais que c'est pareil que

 (*x).y
2
Logan Capaldo

La différence la plus simple entre les deux est que "->" déréférence un pointeur avant de regarder les objets, champs, fonctions, etc. alors que "." ne déréférence pas en premier. Utilisez "->" lorsque vous avez un pointeur sur un objet et utilisez "." lorsque vous travaillez avec l'instance réelle d'un objet.

Une autre méthode équivalente consiste à utiliser d’abord le déréférencement "*" sur le pointeur, puis à utiliser simplement le ".". Nous évitons les intermédiaires en utilisant "->".

Il y a d'autres différences, mais les autres réponses ont largement couvert cela.

Si vous avez un arrière-plan dans Java, vous risquez de vous dérouter car, en Java, tout est un indicateur. Cela signifie qu'il n'y a aucune raison d'avoir un symbole qui ne déréférence pas votre pointeur en premier. Cependant, en c ++, il faut être un peu plus prudent pour se souvenir de ce qui est ou non un pointeur, et il peut être judicieux de les étiqueter avec le préfixe "p_" ou simplement "p".

1
Mads Engberg

Le . (point) L'opérateur est généralement utilisé pour obtenir un champ/appel d'une méthode à partir d'une instance de classe (ou d'un champ/méthode statique d'une classe).

p.myField, p.myMethod () - p instance d'une classe

L’opérateur -> (flèche) permet d’obtenir un champ/appel d’une méthode à partir du contenu pointé par la classe.

p-> myField, p-> myMethod () - p pointe sur une classe

1
Samuel Carrijo

L'opérateur -> est utilisé lorsque nous travaillons avec un pointeur et le point est utilisé autrement. Donc, si nous avons une classe de structure comme:

struct class{ int num_students; int yr_grad; };

et nous avons une instance d'une classe * curr_class (pointeur de classe), alors pour avoir accès au nombre d'étudiants, nous ferions

cout << curr_class->num_students << endl;

Dans le cas où nous aurions un objet de classe simple, par exemple class_2016, nous le ferions.

cout << class_2016.num_students << endl;

Pour que le pointeur classe, l'opérateur -> est équivalent à

(*obj).mem_var

Remarque: pour une classe, le moyen d'accéder aux fonctions membres de la classe sera également le même

1
PYA