dlakin95 Temat założony przez niniejszego użytkownika |
[C++] Różnica między metodą a statyczną funkcją klasy (przekazywanie obiektu) » 2020-04-25 11:49:41 Cześć. Często spotykam się ze stwierdzeniem "Metoda klasy jest tłumaczona na funkcję statyczną, której pierwszym argumentem jest WSKAŹNIK na wywołany obiekt". Rozumiem to w ten sposób, że interpretując wyrażenie wywołujące metodę np. ((A)a).method(), to przetłumaczył, by to na funkcję A::method((A*)a). Dla uproszczenia zastosowałem notację C. Niestety, trzymając się takiego rozumowania pojawiają się pewne nieścisłości. Ponieważ jest możliwość kompilacji kodu poniżej. class A { void method(); static void method( A * ); static void method( A & ); static void method( const A * ); };
Mógłby mi ktoś wyjaśnić, co źle rozumiem i jak powinienem to rozumieć? |
|
jankowalski25 |
» 2020-04-25 13:40:26 Żadna z tych trzech wersji nie jest tą właściwą. Pierwszy argument to nic innego, jak po prostu this . Z samego użycia this->cokolwiek; możesz wyciągnąć wniosek, że to jest wskaźnik, więc druga opcja odpada (jakby to była referencja, to należałoby wpisać this.cokolwiek; ). Trzecia opcja też odpada, bo można modyfikować to, na co wskazuje this . Natomiast w pierwszym przypadku brakuje tu jeszcze jednej rzeczy, mianowicie this = innyWskaznik; ma nie działać. Czyli to ma być taki wskaźnik, którego nie możesz przepiąć tak, aby wskazywał na inny obiekt (natomiast możesz modyfikować to, na co wskazuje; chyba że sama metoda jest oznaczona jako const ). Z tego powodu trzeba dopisać const po drugiej stronie gwiazdki (patrz: Wskaźniki Wskaźniki, a const), aby uzyskać dokładnie to samo, co daje this . |
|
dlakin95 Temat założony przez niniejszego użytkownika |
» 2020-04-25 14:56:13 Super. Dzięki za wyjaśnienie i usystematyzowanie trochę mojej wiedzy. Jednak pozostaje jeszcze 2 pytania. 1. Czy kompilator faktycznie traktuje metodę jako funkcję, która przyjmujące jako pierwszy ukryty parametr this, który jest "iterpretowany" przez kompilator jako odnośnik do adresu na stosie pierwszego argumentu funkcji? 2. Dlaczego kompilator umożliwia taką kompilację? Wiem, że kompilatory stosują "name mangling", ale czy ma to zastosowanie też dla statycznych funkcji, które są w tej samej przestrzeni klasy. class A { public: void method(); static void method( A * const a ); };
Stosuję IDE od Qt. Gdy najedzie się na nazwę zmiennej podawany jest jej dokładny typ. Gdy najadę na "this", jest napisane, A*. Pewnie jest to zależne od Qt, ale pewny nie jestem. |
|
pekfos |
» 2020-04-25 16:00:53 1. Czy kompilator faktycznie traktuje metodę jako funkcję, która przyjmujące jako pierwszy ukryty parametr this, który jest "iterpretowany" przez kompilator jako odnośnik do adresu na stosie pierwszego argumentu funkcji? |
Nie. Metoda, metoda statyczna i funkcja nie są sobie równoważne i nie ma w C++ nic, czym możesz taką równoważność zasymulować. Jeśli dla którejś z nich kompilator zdecyduje się wygenerować wywoływalny kod, to ewentualne this jest implementowane jako dodatkowy argument. 2. Dlaczego kompilator umożliwia taką kompilację? |
Masz dwie poprawnie przeciążone metody, jedną z argumentem i drugą bez. Stosuję IDE od Qt. Gdy najedzie się na nazwę zmiennej podawany jest jej dokładny typ. Gdy najadę na "this", jest napisane, A*. Pewnie jest to zależne od Qt, ale pewny nie jestem. | this nie jest wskaźnikiem, tylko słowem kluczowym, które w metodach niestatycznych ma wartość typu cv A*, gdzie cv to dowolna kombinacja modyfikatorów const i volatile, wzięta ze specyfikacji metody. |
|
dlakin95 Temat założony przez niniejszego użytkownika |
» 2020-04-25 16:09:46 Dobra. Dzięki za pomoc. |
|
« 1 » |