Wątek przeniesiony 2019-01-02 09:05 z Newbie przez Adam Boduch.

Wytłumaczenie przeciążenia operatora.

0

Witam. Uczę się przeciążania operatorów w C++, aby móc m.in. dodawać ze sobą dwa obiekty tej samej klasy. Z pomocą internetowych tutoriali napisałem taki program dla ćwiczeń:

#include <iostream>
using namespace std;

class Vector
{
private:
    int a;
    int b;
public:
    Vector() {a=0; b=0;}
    Vector(int a, int b){this->a=a; this->b=b;}

    Vector operator+(const Vector & x) 
    {
        return Vector(this->a + x.a, this->b +x.b);
    }

    void pokaz()
    {
        cout<<"Zmienna a = "<<a<<endl;
        cout<<"Zmienna b = "<<b<<endl<<endl;
    }

} ;

int main()
{
    Vector v1(2,4);
    v1.pokaz();

    Vector v2(8,6);
    v2.pokaz();

    Vector v3;
    v3.pokaz(); //pokaze a=0 i b=0

    v3 = v1 + v2;

    v3.pokaz();//teraz pokaze a=10 i b=10, czyli obiekty v1 i v2 zostaly dodane i wynik przypisany do v3
    return 0;
}

Program działa, ale:

  1. Czy napisałem to dobrze?
  2. Jeżeli mam być szczery, to chyba nie do końca wiem co tam się dzieje. xD
    Gdyby opisać to przeciążenie słowami:

Przy przeciążeniu najpierw deklarujemy typ zwracany (w tym przypadku Vector), potem słowo kluczowe [email protected], gdzie @, to operator, jaki chcemy przeciążyć (sam symbol @ w c++ nie jest operatorem). I teraz: jako pierwszy argument podajemy... i co to właściwie jest? xD
Jest znak &, czyli to jest referencja, czy jakiś rodzaj wskaźnika "this", który będzie wskazywać... właśnie na co?

Potem jak mamy instrukcje return:

return Vector(this->a + x.a, this->b +x.b);

Tu mam rozumieć, że zwracamy obiekt typu Vector i w nawiasie przez wskaźnik this przypisujemy do pola w klasie Vector wartość, która pobieramy z x.a (czyli argumentu z funkcji)? Może mi ktoś łopatologicznie wyjaśnić, co tam się dzieje, bo dzięki internetowym kursom jakoś mniej więcej zrozumiałem idee przeciążania operatorów, ale chyba nie do końca. xd

1

Wygląda na to, że zrobiłeś to poprawnie. Więcej o przeładowywaniu operatorów rozpisałem się tutaj: https://dsp.krzaq.cc/post/304[...]wac-operatory-w-mojej-klasie/

& w parametrze oznacza, że przyjmujesz referencję (tutaj const)
this - to powinieneś wiedzieć z kursu/książki - jest wskaźnikiem na obiekt klasy, na którym wywołana jest funkcja

return Vector(this->a + x.a, this->b +x.b); To masz rozumieć tak, że zwracasz nowy obiekt zainicjalizowany podanymi wartościami. Analogiczny (prawie) kod:

int new_a = a + x.a;
int new_b = b + x.b;
Vector ret(new_a, new_b);
return ret;
0
kq napisał(a):

Wygląda na to, że zrobiłeś to poprawnie. Więcej o przeładowywaniu operatorów rozpisałem się tutaj: https://dsp.krzaq.cc/post/304[...]wac-operatory-w-mojej-klasie/

& w parametrze oznacza, że przyjmujesz referencję (tutaj const)
this - to powinieneś wiedzieć z kursu/książki - jest wskaźnikiem na obiekt klasy, na którym wywołana jest funkcja

return Vector(this->a + x.a, this->b +x.b); To masz rozumieć tak, że zwracasz nowy obiekt zainicjalizowany podanymi wartościami. Analogiczny (prawie) kod:

int new_a = a + x.a;
int new_b = b + x.b;
Vector ret(new_a, new_b);
return ret;

O taką odpowiedź mi chodziło. Mam jeszcze pytanie odnośnie wytłumaczenia wskaźnika this. Jak sam napisałeś, this jest wskaźnikiem na obiekt klasy, na którym wywołana jest funkcja. Wskaźnikiem na obiekt klasy, czyli nie całą klasę, ale np. na jedno z jej pól?(bo pole to zmienna, a zmienne też są przecież obiektami). I o co chodzi z tymi "na którym wywołana jest funkcja"? Jak to rozumieć? Że wywołujemy funkcję, która jest metodą klasy i poprzez użycie wskaźnika this odwołujemy się do jej pól?

2

Nie musisz cytować posta jeśli bezpośrednio pod nim odpowiadasz. Nawet nie powinieneś. Szczególnie całego.

v3 = v1 + v2;

Ten zapis należy rozumieć jako czytelniejszy, ale analogiczny zapis tego:

v3 = v1.operator+(v2);

Zauważ, że operator+ to zwykła funkcja, tylko ze specjalną nazwą. Równie dobrze mogłaby się nazywać foo. W wywołaniu v1.operator+(v2), this jest wskaźnikiem na v1, a x (const) referencją do v2.

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