Jak zwykle w C++ rzeczy są mniej proste, niż mogłoby się wydawać.
Istnieją trzy sposoby wywoływania funkcji członków.
- tylko wywołać funkcję:
foo();
- wezwanie z
this
: this->foo();
- używać nazwy klasa to:
classname::f();
Numery # 1 i # 2 są równoważne, niektórzy ludzie wolą # 2, ponieważ jest jaśniejsze, że jest to funkcja członkowska, a nie funkcja globalna (ci ludzie są w mniejszości).
To, czy # 3 różni się od # 1, a # 2 zależy od tego, czy wywoływana funkcja jest funkcją wirtualną. Jeśli jest to nie-wirtualne, nie ma różnicy.Jeśli to jest wirtualny i istnieje więcej pochodnych zastąpienia tej funkcji następnie # 1 i # 2 będą nazywane pochodną funkcją, a # 3 wywoła zastąpienie, które istnieje w tej klasie (lub jeśli nie ma żadnych przesłonięcie w tej klasie , najbliższa super-klasa).
Wyjątkiem od poprzedniego akapitu jest sytuacja, gdy strona wywoławcza znajduje się w konstruktorze lub destruktorze. W tym przypadku, nawet jeśli funkcja jest wirtualna # 1, a # 2 będzie zachowywać się tak samo jak # 3 (wywołaj nadpisanie w tej lub najbliższej super-klasie).
Dodatkowo, jeśli funkcja jest static
, to # 2 jest nieważne, a # 1 i # 3 są równoważne, gdy są wywoływane z poziomu klasy, ale # 3 jest potrzebny, gdy zostanie wywołany spoza klasy.
Mam nadzieję, że nie przegapisz niczego :)
Czego nieodebrane:
this
mogą być potrzebne, jeśli funkcja jest ukryty przez globalną re-zadeklarowana wewnątrz powołania funkcjonować. Zobacz @Dutow's answer.
this
może być przydatny podczas pracy z two phase lookup (gdy szablony są zaangażowane). Dzięki @Alejandro za komentarz.
- Zgaduję, że użycie
using
może rzucić trochę więcej błota w wodzie, ale nie mogę się tym przejmować (zablokować emptora).
Rzeczywiście, nie jest tak proste, jak mogłoby się wydawać ...
Odpowiedź na to pytanie jest dobrym kandydatem do tego nowego rodzaju lasera Documentation. – Dialecticus