Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Różnica między metodą a statyczną funkcją klasy (przekazywanie obiektu)

Ostatnio zmodyfikowano 2020-04-25 16:09
Autor Wiadomość
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.

C/C++
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ć?
P-176721
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: » Kurs C++ » Poziom 5Wskaźniki lekcja Wskaźniki, a const), aby uzyskać dokładnie to samo, co daje
this
.
P-176722
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.

C/C++
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.
P-176723
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.
P-176724
dlakin95
Temat założony przez niniejszego użytkownika
» 2020-04-25 16:09:46
Dobra. Dzięki za pomoc.
P-176725
« 1 »
  Strona 1 z 1