Przeciążanie operatorów

Przeciążanie operatorów - pozwala nadpisać działanie standardowych operatorów dla własnych typów danych.

Przeciążany operator jest funkcją zaczynająca sie od operator

c = a + b;

jest równoważne

c.operator=( a.operator+(b) );

sposób 1: globalna funkcja operatorowa, np. operator+(Typ1 a, Typ2 b)

preferowana jeśli po lewej stronie ma stać obiekt, którego nie możemy modyfikować

gdy funkcja operatorowa musi korzystać z pól prywatnych argumentu to musi być zaprzyjaźniona z klasą tego argumentu

sposób 2: funkcja składowa (metoda) klasy Typ1::operator+(Typ2 b)

niektóre operatory (operator=, operator[]) musza być niestatycznymi funkcjami składowymi klasy

nie możemy przeładowywać operatorów dla typów wbudowanych (int, char, float)

Ćwiczenie: Przeciążanie operatorów w klasie Wielomian

1. Przeciąż dla klasy Wielomian operator przesunięcie bitowego << w taki sposób aby realizował wypisanie wielomianu w strumieniu wyjściowym ostream.
Przykład:

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.

double wsp[] = { 3 , 5 , 1}; int st=2; Wielomian w1(st,wsp); Wielomian w2; w2=w1;

3. Dociąż operator + tak aby realizował dodawanie dwóch wielomianów (operator może zastąpić funkcję Dodaj())

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:

Wielomian w; cout << w[0] << end; w[0]++; cout << w << end;

6. Przeciąż jednoargumentowy operator * tak aby realizował pochodną stopnia 1-go.

Wielomian w1; cin >> w1; Wielomian pochodna = *w1; Wielomian pochodna2 = ****w1;

7. Zrealizuj przekształcanie 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 (), który zwraca wartość wielomianu dla podanej w argumencie wartości rzeczywistej typu double'. Przykładowo, jeśli mamy wielomian postaci to jego wartość w punkcie wynosi . 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 Hornara.
Dla wielomianu postaci wyznaczania wartości w punkcie za pomocą schematu Hornera:

ustaw wartość początkową

dla każdego kolejnego wykonuj

podstaw do wynik

zwróć wynik

Napisz program, który wykorzysta klasę Wielomian oraz operator () do przeprowadzenia symulacji trajektorii lotu obiektu rzuconego pionowo w górę z wysokości z prędkością początkową . Położenie obiektu opisane jest funkcją wielomianową gdzie stała przyspieszenia ziemskiego wynosi . Dla podanych przez użytkownika wartości oraz program wypisuje wysokość obiektu w kolejnych sekundach ruchu od momentu rzutu aż do momentu osiągnięcia powierzchni Ziemi . 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