Przeciążanie operatora jako metody klasy i this
Ostatnio zmodyfikowano 2015-10-08 21:00
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 : #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 ? |
|
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) |
|
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ę |
|
mateczek |
» 2015-10-08 20:59:25 #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 ); 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" struct A { int skladnik; };
func( A * obiekt ) { obiekt->skladnik = 12; }
int main() { A a; func( & a ); }
struct A { int skladnik; func() { this->skladnik = 12; skladnik = 12; } } int main() { A a a.func() }
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() |
|
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. |
|
« 1 » |