Le formulaire -> est juste un raccourci pour de-refrencing le pointeur et l'accès au membre.
(*ptr).field;
// Equiv to
ptr->field;
Une bonne raison d'utiliser -> est que lorsque vous suivez une chaîne:
int x = (*(*(*(*ptr).field1).field2).field3).field4;
// Equiv to
int y = ptr->field1->field2->field3->field4;
Le second devient beaucoup plus lisible.
Comme pour la deuxième partie de votre question.
Je trouve vraiment facile de trouver un exemple.
#include <iostream>
class Shape
{
public: virtual ~Shape() {}
virtual void Print() {std::cout << "Shape\n";}
};
class Point: public Shape
{
public: virtual void Print() {std::cout << "Point\n";}
};
int main()
{
Point p;
Shape* s = &p;
s->Print();
(*s).Print();
}
> vi x.cpp
> g++ x.cpp
> ./a.exe
Point
Point
Comme vous pouvez le voir le résultat est le même dans les deux situations.
Lorsque vous appelez une méthode via un pointeur ou une référence, le mécanisme d'appel virtuel est appelé. L'opérateur star (AKA derefence operator) renvoie une référence à un objet (il ne dé-référence pas réellement l'objet). Donc, quand il est utilisé pour appeler une méthode, le mécanisme d'appel virtuel sera appelé et la version la plus dérivée de la méthode appelée.
Voulez-vous dire '(* ptr) .field' ou' * ptr.field'? Si vous vouliez vraiment dire '* ptr.champ », alors ces deux formes n'ont rien en commun, ce qui rend la question pratiquement dénuée de sens. – AnT
je voulais dire (* ptr) .field – aharon
De votre vérification: La réponse sera la même. Voir ci-dessous. –