->
To jedyny naprawdę trudny. Musi to być niestatyczna funkcja składowa i nie pobiera żadnych argumentów. Wartość zwracana jest używana do wyszukiwania elementu członkowskiego.
Jeśli zwracana wartość jest innym obiektem typu klasy, a nie wskaźnikiem, to kolejne wyszukiwanie elementu członkowskiego jest również obsługiwane przez operator->
funkcję. Nazywa się to „zachowaniem drążenia w dół”. Język łączy ze sobą operator->
wywołania, aż ostatnia zwróci wskaźnik.
struct client
{ int a; };
struct proxy {
client *target;
client *operator->() const
{ return target; }
};
struct proxy2 {
proxy *target;
proxy &operator->() const
{ return * target; }
};
void f() {
client x = { 3 };
proxy y = { & x };
proxy2 z = { & y };
std::cout << x.a << y->a << z->a;
}
->*
Ten jest podstępny tylko dlatego, że nie ma w nim nic specjalnego. Wersja bez przeciążenia wymaga obiektu wskaźnika do typu klasy po lewej stronie i obiektu wskaźnika do typu elementu członkowskiego po prawej stronie. Ale kiedy go przeładujesz, możesz wziąć dowolne argumenty i zwrócić wszystko, co chcesz. Nie musi nawet być członkiem niestatycznym.
Innymi słowy, ten jest po prostu normalnym operatorem, jak +
, -
i /
. Zobacz także: Czy wolny operator -> * przeciąża zło?
.*
i .
Nie można ich przeciążać. Istnieje już wbudowane znaczenie, gdy lewa strona jest typu klasowego. Być może miałoby to trochę sensu, gdyby można było je zdefiniować dla wskaźnika po lewej stronie, ale komitet projektujący język zdecydował, że byłoby to bardziej zagmatwane niż przydatne.
Przeciążenia ->
, ->*
, .
, i .*
może wypełnić tylko w przypadku, gdy wyrażenie będzie niezdefiniowana, to nigdy nie może zmienić znaczenie wyrażenia, które byłyby ważne bez przeciążenia.