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

wskaźnik do obiektu klasy

Ostatnio zmodyfikowano 2016-10-16 14:12
Autor Wiadomość
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.
C/C++
#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:
C/C++
class JakasKlasa
{
    int x;
   
public:
    void m( int x )
    {
        this->x = x;
        //Do x z klasy przypisujemy argument x
    }
};
no więc jak w końcu? Na "obiekt, dla którego została wywołana metoda" czy składnik klasy?
P-152570
carlosmay
» 2016-10-15 23:20:01
Na obiekt.
C/C++
#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ć.
P-152571
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):
C/C++
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?
P-152574
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.
P-152575
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).
std::cout << f << '\n';
Właśnie tutaj wypisywane są wartości
5
 i
10
.
P-152577
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-10-16 11:15:24
Czyli w tej metodzie:
C/C++
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?
P-152582
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:
Tylko... po co?
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.
P-152586
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-10-16 14:12:28
Aha... ok, dzięki za pomoc.
P-152587
« 1 »
  Strona 1 z 1