Witam
ptrPlane (Plane* nP) : pPlane(nP) {cout << "Konstruktor ptrPlane" << endl;};
To co się dzieje po nazwie konstruktora to lista inicjalizacyjna - inaczej mógłbyś to zapisać tak, działałoby dokładnie tak samo:
ptrPlane (Plane* nP) {
this->pPlane = Np;
cout << "Konstruktor ptrPlane" << endl;
};
Co do przeciążeń operatorów to odpalają się one, za każdym razem gdy na obiekcie klasy ptrPlane ich użyjesz
Plane* operator-> () { return pPlane; };
Czyli każdym razem gdy na wskaźniku użyjesz -> to zwróci ten zapis wskaźnik na obiekt klasy Plane
Plane& operator* () { return *pPlane; };
Za każdym razem gdy będziesz próbował dokonać dereferencji na obiekcie to te przeładowanie zwróci dereferencje obiektu pPlane.