2010-12-04 5 views
1

Je viens d'un monde de programmation Delphi/Pascal mais je "joue" parfois avec C++ ou C de temps en temps, il y a une question qui me dérange le plus: pourquoi C++ utilise "." accéder à un membre de la structure et "->" pour accéder à la méthode? en Delphi/Pascal nous utilisons "." Quelqu'un m'a dit que cela avait quelque chose à voir avec la façon dont le C++ accède à la mémoire, mais cette réponse n'est PAS suffisante pour m'aider à comprendre.pourquoi C++ utilise DOT pour accéder aux membres de la structure et -> pour accéder à la méthode?

Merci.

Répondre

5

Tous les membres de structure (champs et méthodes) sont accédés de la même manière. Mais, en cas de pointeur vers la structure, il existe deux syntaxes différentes pour le même but: (* pStruct) .member et pStruct-> member.

Dans Pascal (ou Delphi):

var pointerToSomeRecord: ^SomeRecord; 

pointerToSomeRecord^.field := 42; 

En C++:

SomeStruct* pointerToSomeStruct; 

(*pointerToSomeStruct).field = 42; 

Mais, en C++ il y a aussi une autre façon:

pointerToSomeStruct->field = 42; 

La plupart des programmeurs C++ comme le forme plus tard beaucoup plus.

+0

maintenant c'est une très très très bonne réponse, merci !! – ComputerSaysNo

4

Vous les déroutez.

foo->bar() est sémantiquement équivalente à (*foo).bar() (sauf surcharge de l'opérateur.)

-> est utilisé lorsque l'argument de gauche est un pointeur .

. est utilisé lorsqu'il est une référence ou n'est pas un pointeur.

Il n'a absolument rien à voir avec le côté droit.

+0

@James: Durr. Merci. : P – greyfade

2

Vous vous êtes trompé. C++ utilise un point pour l'accès des membres et pour appeler des méthodes sauf si vous avez un pointeur vers l'objet que l'opérateur -> applique.

Le -> est fonctionnellement le même que (*obj).x()

2

L'opérateur de flèche est une abréviation pour l'accès aux membres de la structure par l'intermédiaire de pointeur:

struct foo { 
    int field; 
} 

struct foo* ptr = ...; 

Ce

(*ptr).field 

est essentiellement le même que

ptr->field 

Cela n'a rien à voir avec l'accès aux fonctions membres ou aux champs de données.

9

Votre compréhension est incorrecte. C++ accède aux membres de données et aux fonctions membres (le terme "méthode" n'est pas utilisé par les programmeurs C++) de la même manière.

. accède à un membre d'un objet. -> accède à un membre de l'objet pointé par un pointeur vers un objet. foo->bar est exactement équivalent à (*foo).bar. C'est pourquoi quelqu'un vous a dit "cela a quelque chose à voir avec la façon dont le C++ accède à la mémoire" - parce que c'est le cas.

+0

merci, c'est très utile pour ma compréhension – ComputerSaysNo

+1

Ce n'est pas * exactement * équivalent, parce que 'foo-> bar' signifie en fait' foo {-> opérateur ->()} -> bar', où '{exp } 'signifie" répète 'exp' n'importe quel nombre de fois" :) – fredoverflow

+0

@FredOverflow: oui, j'ai sauté dessus, pour des raisons heureusement évidentes. :) J'étais insouciant dans mon phrasé, cependant. +1 –

Questions connexes