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.