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)=3x2+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 anxn++a1x+a0 wyznaczania wartości w punkcie x za pomocą schematu Hornera:

  1. ustaw wartość początkową y=an
  2. dla każdego kolejnego i=n1,n2,,1,0 wykonuj
    • podstaw do y wynik xy+ai
  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 h0 z prędkością początkową v0. Położenie obiektu opisane jest funkcją wielomianową y(t)=h0+v0tgt22 gdzie stała przyspieszenia ziemskiego wynosi g9,81ms2. Dla podanych przez użytkownika wartości h0 oraz v0 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