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

Przeciążanie operatora jako metody klasy i this

Ostatnio zmodyfikowano 2015-10-08 21:00
Autor Wiadomość
ast44
Temat założony przez niniejszego użytkownika
Przeciążanie operatora jako metody klasy i this
» 2015-10-08 20:45:35
Mam kilka pytań :
1.Dlaczego kiedy przeciążamy operator jako metodę klasy możemy dopisać tylko jeden argument (tak wiem ze jest jeszcze niejawny this, ale to nic nie zmienia i o tym za chwilę) ?
2.Jak to jest z tym this ? Nie za bardzo rozumiem jak on działa.Zrobiłem taki kod :

C/C++
#include <iostream>

using namespace std;

class zespolone
{
public:
    double x, y;
    zespolone( double _x, double _y )
    {
        x = _x;
        y = _y;
    }
    void operator =( const zespolone & z_1 )
    {
        if( z_1.x ==( * this ).x && z_1.y ==( * this ).y )
        { cout << "Liczby sa rowne" << endl;
        }
        else
        {
            cout << "Liczby nie sa rowne";
        }
    }
};


int main()
{
    zespolone z_1( 1, 1 ), z_2( 2, 2 );
   
    z_1 = z_1;
    z_1 = z_2;
   
    return 0;
}

I choć napisałem i choć nawet działa to nie wiem czy dobrze rozumiem na jakiej zasadzie.Moja teoria jest taka że w liniach w których porównuje  obiekty z_1, z_2 klasy zespolone komputer bierze wskaźnik this z jednego z obiektów i referencję z drugiego.Jednak co decydowałoby o tym z którego obiektu weźmie się ten wskaźnik ?
P-138290
carlosmay
» 2015-10-08 20:49:28
Wskaźnik this zawsze odnosi się do obiektu na rzecz którego wywołana jest metoda. 1 : 0 dla Polski (lewy)
P-138291
ast44
Temat założony przez niniejszego użytkownika
» 2015-10-08 20:55:32
No to na rzecz którego i dlaczego został wywołany wskaźnik this ? z_1 czy z_2 ? No i jeszcze moje pierwsze pytanie :D

PS: Mecz nie zapowiada się na tragedię
P-138292
mateczek
» 2015-10-08 20:59:25
C/C++
#include <iostream>

using namespace std;

class zespolone
{
public:
    double x, y;
    zespolone( double _x, double _y )
    {
        x = _x;
        y = _y;
    }
    void operator =( const zespolone & z_1 )
    {
        if( z_1.x ==( * this ).x && z_1.y ==( * this ).y )
        { cout << "Liczby sa rowne" << endl;
        }
        else
        {
            cout << "Liczby nie sa rowne";
        }
    }
};


int main()
{
    zespolone z_1( 1, 1 ), z_2( 2, 2 );
   
    z_1 = z_2;
    z_1.operator =( z_2 );
    //równoważne zapisy
   
    return 0;
}
Dlatego jeden argument. Bo drugim jest sam obiekt na rzecz którego dokonujesz przypisania!!! co widać gdy zamienisz wywołanie z operatorowego na wywołanie funkcji operatorowej !!!

A. This wewnątrz metody danej klasy jest wskaźnikiem na obiekt tej klasy. Wskaźnikiem na obiekt, dla którego pracuje funkcja

z_1.operator =( z_2 );
 przy takim wywołaniu "this" wewnątrz metody operator=() jest wskaźnikiem na obiekt "z_1"


Dam przykład z klasycznego "C"
C/C++
//w klasycznym "C" pisało się tak:
struct A {
    int skladnik;
};

func( A * obiekt ) {
    //coś z "obiekt"
    obiekt->skladnik = 12;
    //w c++ by było
    //this->sklandik=12;
}


//wywołanie
int main() {
    A a;
    func( & a ); //przekazanie obiektu do funkcji
}

// wc++ jest prawie tak samo :P

struct A {
    int skladnik;
    func() {
        this->skladnik = 12;
        // this jest w domyśle więc można pominąć !!! i napisać
        skladnik = 12;
    } // funkcja jest w zasięgu klasy
}
int main() {
    //wywołanie
    A a
    a.func() // tutaj funkcja dostaje obiekt "a" do obróbki. Do obiektu "a" funkcja może się dobrać za pomocą wskaźnika "this"
}
funkcja zawsze działa na jakimś obiekcie w "C" trzeba było przekazać obiekt jawnie do funkcji. W c++ można w sposób mniej jawny!!!
Ot i tajemnica this :)!!!  w "C" było func(a) jawnie. A w "C++" a.func()
P-138294
Monika90
» 2015-10-08 21:00:13
Lewy argument operatora przekazywany jest jako this. Oczywiście tak jest tylko dla tych operatorów dwuargumentowych, które zdefiniowane są jako funkcje składowe.
P-138295
« 1 »
  Strona 1 z 1