*this jak to działa

0

witam szukałem informacji po sieci ale nie znalazłem nic co moglo bymi to w jasny sposob wytlumaczyc, wiec mysle ze najlepiej oprzec sie na moim przykladzie i na nim to wyjasnic:

class Wektor 
{        
    float *wyraz; // przechowywanie współrzędnych równania 
  
  public: 
          
    Wektor()  { wyraz=new float[3];}  //konstruktor 
    /*new float - utworzenie nowego obiektu typu float. 
    Nie ma on nazwy ale jego ares przekazywany jest 
    wskaźnikowi *wyraz */ 
  
                
    float   operator   [ ] (unsigned int ind) const; // przeciazenie operatorow [] 
    float & operator   [ ] (unsigned int ind); 
    Wektor  operator    -  (Wektor);                 // przeciazenie operatora odejmowania na wektorach 
    Wektor  operator    *  (float);                  // przeciazenie operatora mnozenia na liczbach 
    float   operator    *  (Wektor); 
  
    float   Modul(); 

}; 


float Rozwiazania::ObliczBlad() 
  { 
    Wektor norma; 
    norma=*wspol*(rozw)-*wolne; 
    blad=norma.Modul(); 
    return blad; 
  }

nie wiem czy jest potrzebny fragment podu ponizej ale jest uzyta metoda modul wiec zamieszcze go rowniez:

float Rozwiazania::ObliczBlad() 
  { 
    Wektor normalny; 
    normalny=*wspol*(rozw)-*wolne; 
    blad=normalny.Modul(); 
    return blad;
0

Zapomniales napisac co ma wspolnego przyklad z tematem...

0

cholerka skopiowalem nie te linijki co trzeba

float Wektor::Modul()
{   
   float wynik=(*this)*(*this);
   return sqrt(wynik);
}

to mialo byc pod klasa zamiast metody oblicz blad

0

No ale czego nie rozumiesz? Metoda Wektor::Modul mnozy utworzony przez użytkownika klasy obiekt Wektor (czyli normę) przez siebie używając przeciążonego operatora * a potem wyciaga pierwiastek z wyniku i go zwraca

0

To troche pokretne wywolanie operatora *, konkretnie tego:

float   operator    *  (Wektor); 

this to wskaznik na obiekt na rzecz, ktorego zostala wywolana metoda, czyli w przykladowym kodzie jest to obiekt norma, bo na jego rzecz zostala wykonana metoda Modul().
this to zastosowanie operatora wyluskania/dereferencji (), ktory pobiera obiekt, na ktory wskazuje wskaznik - jaki to obiekt? Patrz wyzej.
Zatem to:

*this**this //tak tez moze byc, dereferencja wykona sie wczesniej niz mnozenie

oznacza:

  • znalezienie obiektu, na rzecz ktorego zostala wywolana metoda
  • wykonanie operacji obiekt * obiekt
  • w jej wyniku zostaje dopasowany operator Wektor * Wektor i wykonana operacja.
0

Ok dzieki wielkie a jesl ichodzi o :

class LZespolona {
  public:
    float  _re, _im;

    LZespolona() { _re = _im = 0; }
    LZespolona(float r, float i) { _re = r;  _im = i; }

    LZespolona& operator = (float Arg) { _re = _im = 0;  return *this; }
    LZespolona& operator += (LZespolona Z) 
                          { _re += Z._re;  _im = Z._im;  return *this; }
    LZespolona operator + (LZespolona Z2) 
                                     { return Z2 += *this; }

    LZespolona& operator ++ () { ++_re;  ++_im;  return *this; }
    LZespolona& operator ++ (int) { return ++*this; }
    LZespolona& operator + () { return *this; }
    LZespolona  operator * (const LZespolona & Z2);

to tutaj na jakiej zasadzie jest pobierane *this

0

Na tej samej - zwracasz samego siebie. W przypadku tych operatorow ma to takie znaczenie, ze mozesz je wywolac kaskadowo, np.

obiekt1 * obiekt2 * obiekt3 * obiekt4;

To powoduje takie dzialania:

  • obliczenie obiekt1 * obiekt2, zwracany jest obiekt tego samego typu, nazwijmy go x
  • obliczenie x * obiekt3, jak poprzednio zwracany jest obiekt tego samego typu, y
  • obliczenie y * obiekt4

Dzieki dopasowaniu operatora do tego samego typu, nastepne dopasowanie tez sie uda, bo ciagle mnozymy obiekty tego samego typu.

//edit
Rownie dobrze moglbys wykonac tez taka, troche dziwna operacje:

obiekt++++++++

co jest tozsame z:

(((obiekt++)++)++)++

czyli wywolaniem 4 razy z rzedu operatora ++.

0
johny_bravo napisał(a)

Rownie dobrze moglbys wykonac tez taka, troche dziwna operacje:

obiekt++++++++

co jest tozsame z:

(((obiekt++)++)++)++

czyli wywolaniem 4 razy z rzedu operatora ++.

Bzdura, preinkrementację tak zrealizować można, postinkrementację nie. wynikiem obiekt++ jest rvalue, zaś ++ działają tylko z lvalue. Po ludzku, inkrementujesz stan zwracając jego poprzednią wartość, ta wartość już nie jest z niczym powiązana.

0

No tak, nie ten przyklad, rozpedzilem sie ;)

0

this to wskaznik na obiekt na rzecz, ktorego zostala wywolana metoda, czyli w przykladowym kodzie jest to obiekt norma, bo na jego rzecz zostala wykonana metoda Modul().

a zakladajac ze zamiast obiektu normy mialbym stworzony jeszcz ejden obiekt? wtedy jak zapisujac *this skad wiadomo do ktorego obiektu sie odwoluje?

0

To do którego obiektu się odwołuje wskaźnik this związane jest z tym, dla jakiego obiektu wywołałeś metodę. Jeśli wywołałeś metodę dla obiektu norma, to na ten obiekt wskazuje this. Jeśli wywołasz metodę dla innego obiektu, to ten wskaźnik wskazuje właśnie na ten inny obiekt.

0

Bo metodę zawsze wywołujesz na rzecz określonego obiektu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1