Przeciążanie operatorów

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:

  1. 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
  2. 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.

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;

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 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:

  1. ustaw wartość początkową $y = a_n$
  2. dla każdego kolejnego $i=n-1, n-2, \ldots , 1, 0$ wykonuj
    • podstaw do $y$ wynik $ x \cdot y + a_i$
  3. 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 Zadanie 4