====== 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 c = a + b;
jest równoważne c.operator=( a.operator+(b) );
Przeciążenie operatora może być zdefiniowane na dwa sposoby:
- jako globalna funkcja operatorowa \\ Typ operator+(Typ1 a, Typ2 b)
* 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 \\ Typ Typ1::operator+(Typ2 b)
* 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:
Wielomian w1;
cout << w1 << endl;
2. Dociąż operator przypisania ''='' dla klasy ''Wielomian'' w taki sposób aby możliwe było wykonanie poniższej operacji.
Wielomian w1, w2;
w2=w1;
3. Dociąż operator ''+'' tak aby realizował dodawanie dwóch wielomianów (operator zastępuje funkcję ''Dodaj()'' z poprzednich zajęć)
Wielomian w1, w2;
cout << "w1 + w2 = " << w1 + w2 << endl;
4. Dla operacji wykonywanych na obiektach klasy Wielomian dociąż dwuargumentowe operatory arytmetyczne ''*'', ''*='', ''+='', ''-'', ''-='' oraz porównanie wielomianów ''=='', ''!=''
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.
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:
Wielomian w;
cout << w[0] << end;
w[0]++;
6. Przeciąż jednoargumentowy operator ''*'' tak aby zwracał pochodną stopnia 1-go wielomianu.
Wielomian w1;
cin >> w1;
Wielomian pochodna = *w1;
Wielomian pochodna2 = ****w1;
7. Zrealizuj operator rzutowania wartości typu ''double'' na obiekt typu ''Wielomian''.
Wielomian w1;
double x = 5.1;
cin >> w1;
Wielomian w2 = w1 + (Wielomian)x;
Wielomian w3 = w2 - 1.2;
===== 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:
double wsp = {1, 2, 3};
Wielomian w(2, wsp);
double y = w(1.0); // wyznaczenie wartosci funkcji
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:
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
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]]