latajacaryba Temat założony przez niniejszego użytkownika |
wskaźnik do obiektu klasy » 2016-10-15 23:09:06 Witam. Natknąłem się na wskaźnik this. Z tego co zrozumiałem to wskazuje on na obiekt na którego rzecz wywoływana jest funkcja klasy. #include <iostream> using namespace std; class Test { public: void funk( Test obiekt ) { Test * wsk = & obiekt; cout << "this : " << this << endl << "wsk : " << wsk; } };
int main() { Test x; x.funk( x ); }
No, tylko gdyby faktycznie tak było, to oba wskaźniki (this i wsk) zwracałyby ten sam adres. A nie zwracają. Dlaczego? Czy wskaźnik this wskazuje na coś innego? Jeśli źle rozumuję, to proszę o wytłumaczenie do czego właściwie jest (przydaje sie) this. Bo lekcja na naszym forum głosi: "W niestatycznych metodach klasy występuje wskaźnik this, który wskazuje na obiekt, dla którego została wywołana metoda. " Po czym następuje przykład: class JakasKlasa { int x; public: void m( int x ) { this->x = x; } };
no więc jak w końcu? Na "obiekt, dla którego została wywołana metoda" czy składnik klasy? |
|
carlosmay |
» 2016-10-15 23:20:01 Na obiekt. #include <iostream>
class Foo { int a; int b; public: void SetProperties( int a, int b ) { this->a = a; this->b = b; } friend std::ostream & operator <<( std::ostream & os, const Foo & foo ) { return os << foo.a << " " << foo.b << '\n'; } void PrintThisAddres() const { std::cout << this << '\n'; } };
int main() { Foo f; f.SetProperties( 5, 10 ); std::cout << f << '\n'; std::cout << & f << '\n'; f.PrintThisAddres(); } Tutaj są dwa składniki (różne adresy w pamięci) dostępne za pośrednictwem jednego this . To jest po prostu adres obiektu f co zresztą sam mogłeś sprawdzić. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-10-16 00:08:16 nie zrozumiałem tej funkcji (o ile to w ogóle jest funkcja): friend std::ostream & operator <<( std::ostream & os, const Foo & foo ) { return os << foo.a << " " << foo.b << '\n'; }
Poza tym dlaczego po wywołaniu tej funkcji: f.SetProperties( 5, 10 ); wypisuje nam na ekran 5 i 10 skoro w jej ciele nie ma nigdzie cout ani print? |
|
michal11 |
» 2016-10-16 00:15:25 Wypisujesz adres lokalnej kopii obiektu a nie tego który przekazujesz przy wywołaniu metody. Skorzystaj z referencji lub wskaźnika. |
|
carlosmay |
» 2016-10-16 01:42:51 f.SetProperties( 5, 10 ); |
Ta metoda ustawia wartości składowych a i b . nie zrozumiałem tej funkcji (o ile to w ogóle jest funkcja): |
Jest funkcja (friend). Właśnie tutaj wypisywane są wartości 5 i 10 . |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-10-16 11:15:24 Czyli w tej metodzie: void SetProperties( int a, int b ) { this->a = a; this->b = b; }
wskaźnik this jest ustawiony na składnik 'a' i przypisuje do niego wartość argumentu 'a'? Tylko... po co? Czy nie lepiej po prostu zmienić argumenty z int a, int b na np. int x, int y? Do czego w ogóle ten wskaźnik się przydaje? |
|
carlosmay |
» 2016-10-16 12:57:55 wskaźnik this jest ustawiony na składnik 'a' |
Niestety nie. Wskaźnik this jest ustawiony na obiekt f , który zawiera składową a . Wskaźnik this przydaje się, gdy chcemy np. zwrócić cały obiekt z metody, np. operator przenieszący, operator kopiujący, operatory arytmetyczne itd; edit: Dzięki temu wiadomo, że to składowa. Nie trzeba go tam pisać, ale on tam jest domyślnie. Pisanie this , w przykładzie to sztuka dla sztuki, ale on tam zawsze jest, napisany czy nie. Czy nie lepiej po prostu zmienić argumenty z int a, int b na np. int x, int y? |
Nie musisz nic zmieniać. Kompilator domyśli się, który identyfikator jest argumentem, a który to składowa. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-10-16 14:12:28 Aha... ok, dzięki za pomoc. |
|
« 1 » |