Przeładowanie operatorów

Transkrypt

Przeładowanie operatorów
Przeładowanie operatorów
Co to jest przeładowanie operatorów?
Zamiast definiować funkcje w obrębie klasy można napisać
nowe wersje operatorów +, - *. Na przykład dodanie
dwóch liczb zespolonych.
Można samemu napisać funkcję „operator dodawania”,
która będzie wywoływana wtedy, gdy koło + pojawiają się
argumenty wybranego przez Ciebie typu. Po prostu po raz
kolejny zostanie przeładowany operator +
Dodawanie licz zespolonych
zespolona operator+(zespolona a,
Wcześniej została zdefiniowana klasa
zespolona b)
Zespolona, której składnikami są rzeczywista
i urojona
{ zespolona suma;
suma.rzeczywista=a.rzeczwista+b.rze
czywista;
suma.urojona=a.urojona+b.urojona;
return suma;
}
Kiedy przeładowanie
Przeładowanie operatora nie jest obowiązkowe. Można
sobie dobrze radzić nie używając go. Jednakże dobrze
obmyślony system przeładowania operatorów dla jakiejś
klasy sprawia, że posługiwanie się nią wydaje się tak
naturalne.
Definicja i teoria
nazwa operator@do takiego obiektu
@=opetator który chcemy przeładować
jako co najmniej jeden z argumentów, przyjmuje obiekt
danej klasy lub referencję
typ_zwracany operator@(argumenty)
{
//ciało funkcji
}
Operatory, które mogą być przeładowane
+-*/%^&~
! = < > += -= *= / = %=
^= &= << >> >>= <<= == !=
<= >= && II ++ -- , ->* ->
() [] new new[] delete delete[]
Operator () –”wywołanie funkcji”
Operator[] –”odniesienie się do elementu tablicy”
Operatory których nie można przeładować
• Polecanie preprocesora # i ##
• Operator sizeof, static_cast, dynamic_cast,
reinterpret_cast, const_cast
• Nie można przeładować: . .* :: ?:
Klasa punkt
punkt operator +( punkt a, punkt b )
{ return punkt( a.x+b.x, a.y+b.y );
}
Przykładowe wywołanie operatorów w programie
punkt operator -( punkt a, punkt b )
{ return punkt( a.x-b.x, a.y-b.y );
}
punkt operator *( punkt a, float b )
{ return punkt( a.x*b, a.y*b );
}
punkt a(5.0,10.0);
punkt b(1,2);
punkt c;
c=a+b;
c.wypisz();
Przeładowanie operatorów
Przeładowanie może nadać dowolne znaczenie
Nie można zmieniać priorytetu wykonywania tych operatorów
Nie można zmieniać argumentowości operatorów
Nie można zmieniać łączności operatorów czyli tego czy operator
łączy się z argumentem z lewej czy z prawej strony
• Ten sam operator można przeładować wielokrotnie, z innym
zestawem argumentów
• Funkcja operatorowa nie musi być składnikiem klasy
•
•
•
•
Zadania do wykonania
• Napisz program, który operuje na liczbach zespolonych. Stwórz
klasę zespolona. Napisz przeładowane wersje operatorów +, - *,
/. W klasie zespolona stwórz możliwość zapisu liczb zespolonych
również w postaci wykładniczej i trygonometrycznej. * Pomyśl o
przeładowanej wersji sprzężenia liczby zespolonej.
• Popraw program punkt o możliwość operacji arytmetycznych na
punktach. Potraktuj punkt jako współrzędne wektora i wykonaj
działania arytmetyczne. Napisz przeładowane wersje operatorów.
Dodawanie rozszerz również na klasę pochodną koło.