Wie in C++ üblich, sind die Dinge weniger einfach als Sie vielleicht denken.
Es gibt drei Möglichkeiten, Elementfunktionen aufzurufen.
- rufen Sie die Funktion:
foo();
- Anruf mit
this
: this->foo();
- den Namen der Klasse verwenden:
classname::f();
Nummern # 1 und # 2 äquivalent sind, einige Leute es vorziehen, # 2, weil Es ist klarer, dass dies eine Mitgliedsfunktion ist und keine globale Funktion (diese Leute sind in einer Minderheit).
Ob # 3 von # 1 und # 2 abweicht, hängt davon ab, ob es sich bei der aufgerufenen Funktion um eine virtuelle Funktion handelt. Wenn es nicht virtuell ist, gibt es keinen Unterschied.Wenn es ist virtuelle und gibt es eine weitere abgeleitete Überschreibung dieser Funktion dann # 1 und # 2 wird die abgeleitete Funktion und # 3 ruft die Überschreibung aufgerufen, die in dieser Klasse vorhanden ist (oder wenn es keine Überschreibung in dieser Klasse , die nächste Superklasse).
Die Ausnahme zum vorherigen Absatz ist, wenn die Call-Site in einem Konstruktor oder einem Destruktor ist. In diesem Fall, selbst wenn die Funktion virtuell ist, wird sich # 1 und # 2 genauso verhalten wie # 3 (rufen Sie die Überschreibung in dieser oder der nächsten Superklasse auf).
Wenn die Funktion static
ist, dann ist # 2 ungültig und # 1 und # 3 sind äquivalent, wenn sie innerhalb der Klasse aufgerufen werden, aber # 3 wird benötigt, wenn sie von außerhalb der Klasse aufgerufen werden.
Ich hoffe, dass ich nichts übersehen haben :)
Dinge, die ich verpasst haben:
this
benötigt werden, wenn die Funktion durch eine globale Wieder erklärte in der Berufung versteckt Funktion. Siehe @Dutow's answer.
this
kann nützlich sein im Umgang mit two phase lookup (wenn Vorlagen beteiligt sind). Danke an @Alejandro für seinen Kommentar.
- Ich vermute, dass mit
using
kann noch mehr Schlamm ins Wasser werfen, aber ich kann nicht belästigt werden, im Moment (caveat emptor) zu untersuchen.
die Tat nicht so einfach, wie man vielleicht denken ...
Antwort auf diese Frage ist guter Kandidat für dieses neue Dokumentation Dingen. – Dialecticus