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:
- 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 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, \ldots , 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 Zadanie 4