Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ====== Przeciążanie operatorów ====== [[https://pl.wikibooks.org/wiki/C%2B%2B/Przeci%C4%85%C5%BCanie_operator%C3%B3w|Przeciążanie operatorów]] - pozwala nadpisać działanie standardowych operatorów dla własnych typów danych. Pozwala to na zwiększenie czytelności i elastyczności kodu. Przeciążany operator jest funkcją lub metodą, której nazwa to ''operatorX'', gdzie ''X'' zastępujemy odpowiednim operatorem, przykładowo <code C++>c = a + b; </code> jest równoważne <code C++> c.operator=( a.operator+(b) ); </code> Przeciążenie operatora może być zdefiniowane na dwa sposoby: - jako globalna funkcja operatorowa \\ <code C++>Typ operator+(Typ1 a, Typ2 b)</code> * preferowana jeśli po lewej stronie operatora ma stać obiekt, którego nie możemy modyfikować * jeżeli funkcja operatorowa wymaga dostępu do pól prywatnych argumentów to musi być zaprzyjaźniona z klasą tego argumentu - jako funkcja składowa (metoda) klasy \\ <code C++>Typ Typ1::operator+(Typ2 b)</code> * niektóre operatory (np. ''operator='', ''operator[]'') musza być niestatycznymi funkcjami składowymi klasy Nie można przeciążyć operatorów dla typów wbudowanych (''int'', ''char'', ''float'', itp.) ani zmieniać ich priorytetów. ===== Ćwiczenie: Przeciążanie operatorów w klasie Wielomian ===== Uzupełnij implementację klasy ''Wielomian'' z poprzednich zajęć dodając przeciążenie operatorów zgodnie z poniższymi instrukcjami. Kod klasy ''Wielomian'' znajdziesz tu: [[pliki]] 1. W klasie ''Wielomian'' dociąż operator przesunięcie bitowego ''%%<<%%'' w taki sposób aby realizował wypisanie wielomianu w strumieniu wyjściowym ''ostream''. \\ Przykład działania: <code C++> Wielomian w1; cout << w1 << endl; </code> 2. Dociąż operator przypisania ''='' dla klasy ''Wielomian'' w taki sposób aby możliwe było wykonanie poniższej operacji. <code C++> Wielomian w1, w2; w2=w1; </code> 3. Dociąż operator ''+'' tak aby realizował dodawanie dwóch wielomianów (operator zastępuje funkcję ''Dodaj()'' z poprzednich zajęć) <code C++> Wielomian w1, w2; cout << "w1 + w2 = " << w1 + w2 << endl; </code> 4. Dla operacji wykonywanych na obiektach klasy Wielomian dociąż dwuargumentowe operatory arytmetyczne ''*'', ''*='', ''+='', ''-'', ''-='' oraz porównanie wielomianów ''=='', ''!='' <code C++> Wielomian w1, w2; Wielomian w3 = w1 + w2; Wielomian w4 = w1 * 3.1; Wielomian w4 = w1 * w4; if (w1 == w2) cout << "Wielomiany są identyczne" << endl; // itd. </code> 5. Przeciąż operator ''[]'' tak aby zwracał wskazany indeksem współczynnik wielomianu na wzór dostępu do elementów tablicy. Operator powinien umożliwiać odczyt i modyfikację współczynnika: <code C++> Wielomian w; cout << w[0] << end; w[0]++; </code> 6. Przeciąż jednoargumentowy operator ''*'' tak aby zwracał pochodną stopnia 1-go wielomianu. <code C++> Wielomian w1; cin >> w1; Wielomian pochodna = *w1; Wielomian pochodna2 = ****w1; </code> 7. Zrealizuj operator rzutowania wartości typu ''double'' na obiekt typu ''Wielomian''. <code C++> Wielomian w1; double x = 5.1; cin >> w1; Wielomian w2 = w1 + (Wielomian)x; Wielomian w3 = w2 - 1.2; </code> ===== Zadanie 4: Operator () w klasie Wielomian ===== Uzupełnij implementację klasy ''Wielomian'' z zajęć dodając przeciążenie operatora ''(double x)'', który zwraca wartość wielomianu ''f(x)'' dla podanej w argumencie wartości rzeczywistej ''x''. Przykładowo, jeśli mamy wielomian postaci $f(x) = 3x^2 + 2x + 1$ to jego wartość w punkcie $x=1$ wynosi $f(1)=6$. Po przeciążeniu operatora ''()'' powinno byc mozliwe wykonanie: <code C++> double wsp = {1, 2, 3}; Wielomian w(2, wsp); double y = w(1.0); // wyznaczenie wartosci funkcji </code> Do wyznaczenia wartości wielomianu wykorzystaj [[wppl>Schemat_Hornera|schemat Hornera]]. \\ Dla wielomianu postaci $a_n x^n + \ldots + a_1 x + a_0$ wyznaczania wartości w punkcie $x$ za pomocą schematu Hornera: - ustaw wartość początkową $y = a_n$ - dla każdego kolejnego $i=n-1, n-2, ... , 1, 0$ wykonuj * podstaw do $y$ wynik $ x \cdot y + a_i$ - zwróć wynik $y$ Napisz program, który wykorzysta klasę ''Wielomian'' oraz operator ''()'' do przeprowadzenia symulacji trajektorii lotu obiektu rzuconego pionowo w górę z wysokości $h_0$ z prędkością początkową $v_0$. Położenie obiektu opisane jest funkcją wielomianową $$y(t) = h_0 + v_0 t - \frac{gt^2}{2}$$ gdzie stała przyspieszenia ziemskiego wynosi $g\approx 9,81 \frac{m}{s^2}$. Dla podanych przez użytkownika wartości $h_0$ oraz $v_0$ program wypisuje wysokość $y(t)$ obiektu w kolejnych sekundach ruchu od momentu rzutu $t=0$ aż do momentu osiągnięcia powierzchni Ziemi $y(t)=0$. Przykład działania programu: <code> Wysokosc poczatkowa : 10 Predkosc poczatkowa : 50 t y(t) ---------------- 0 10.0 1 55.1 2 90.4 3 115.9 4 131.5 5 137.4 6 133.4 7 119.7 8 96.1 9 62.7 10 19.5 </code> Rozwiązanie w postaci plików nagłówkowych ''*.h'' i źródłowych ''*.cpp'' umieść w Moodle [[https://moodle.umk.pl/mod/assign/view.php?id=293575|Zadanie 4]]