Programowanie obiektowe - przeciążanie operatorów.

Nasza ocena:

5
Pobrań: 70
Wyświetleń: 917
Komentarze: 0
Notatek.pl

Pobierz ten dokument za darmo

Podgląd dokumentu
Programowanie obiektowe - przeciążanie operatorów. - strona 1 Programowanie obiektowe - przeciążanie operatorów. - strona 2 Programowanie obiektowe - przeciążanie operatorów. - strona 3

Fragment notatki:

Rozdział 10 Przeciążanie operatorów 10.1 Definicje Język C++ umożliwia przeciążanie operatora, tzn. zmianę jego znaczenia na potrzeby danej klasy. W tym celu definiujemy funkcję o nazwie: operator op gdzie op jest nazwą konkretnego operatora. Funkcja ta może być metodą, czyli funkcją składową klasy lub też zwykłą funkcją. Ponadto musi mieć co najmniej jeden argument danej klasy, co uniemożliwia zamianę dzia- łania operatorów dla wbudowanych typów danych takich jak int, float itp. Dla przykładu rozważmy klasę Wektor zdefiniowaną w rozdziale 8. W niniejszym rozdziale utworzymy klasę WektorR pochodną od klasy Wek- tor, w której przeciążymy kilka operatorów. Oczywiście, można też bez- pośrednio zmienić definicję klasy Wektor, ale przy okazji pokażemy moż- liwość wprowadzania różnych uzupełnień bez zmiany danej klasy. Pro- gramowanie obiektowe to doskonałe narzędzie do tego celu. Jak wiemy, wystarczy zdefiniować klasę pochodną. W klasie Wektor była podana metoda: void Wektor::Dodaj(Wektor b) { int i; for (i=0; iliczba; i++) this-pocz[i] += b.pocz[i]; } Zmiana jaka nastąpiła, to jawne dodanie wskaźnika  this  wskazującego obiekt, na rzecz którego dana metoda została wywołana. Jeżeli zatem napiszemy: a.Dodaj(b); to wskaźnik  this  wskazuje na obiekt a. Realizowana operacja zaś to: a = a + b; A w skróconym zapisie: a += b; Warto się zastanowić, czy nie byłoby sensownie zastąpić metodę Do- daj() po prostu operatorem +=. Nie potrzeba wtedy pamiętać jaką ope- rację realizuje metoda Dodaj(). W języku C++ wystarczy zdefiniować metodę o nazwie: operator += i następującej treści (metodę definiujemy w klasie pochodnej): 10.1 Definicje 79 void WektorR::operator += (WektorR b) { for (int i=0; i

(…)

… danej klasy. Programowanie obiektowe to doskonałe narzędzie do tego celu. Jak wiemy,
wystarczy zdefiniować klasę pochodną.
W klasie Wektor była podana metoda:
void Wektor::Dodaj(Wektor b)
{
int i;
for (i=0; i<liczba; i++)
78
10. Przeciążanie operatorów
pocz[i] += b.pocz[i];
}
Metodę tę wywołujemy następująco:
a.Dodaj(b);
gdzie a i b są obiektami klasy Wektor.
Przypomnijmy sobie, jaką operację realizuje…
… Wektor.
Tablica::~Tablica()
{
delete [m*n] pocz;
}
No i najważniejsza metoda w tym przykładzie:
int & Tablica::operator() (int i, int j)
{
// sprawdzenie poprawności zakresu pierwszego indeksu
if ( i< 0 || i >= m)
i = 0;
// sprawdzenie poprawności zakresu drugiego indeksu
if (j < 0 || j >= n)
j = 0;
return pocz[i * n + j];
}
Metoda ta zwraca referencję do elementu leżącego w i-tym wierszu i j…
… (int i=0; i < a.liczba; i++)
a.pocz[i] += b.pocz[i];
}
Parametry są przekazywane przez referencję, co pozwala na ich zmianę w
wyniku działania funkcji. W przeciwnym przypadku argumenty byłyby
przekazywane przez wartość (jest to dopuszczalne tylko dla parametru
b), co uniemożliwiłoby wykonanie operacji:
80
10. Przeciążanie operatorów
a += b;
W treści funkcji korzystamy z pól prywatnych klasy WektorR…
… operatorów, które muszą być przeciążane przy pomocy metod). Musimy pamiętać, że na obiekt a będzie
wskazywał wskaźnik this, a obiekt b powinien być parametrem.
Pierwsza wersja metody operator= może wyglądać następująco:
82
10. Przeciążanie operatorów
void WektorR::operator = (WektorR &b)
{
// usunięcie części dynamicznej obiektu wskazywanego
// przez wskaźnik this
delete [liczba] pocz;
// utworzenie tablicy…
… w rozdziale
8 (tym razem nie tworzymy klasy pochodnej i definicję operatora dodajemy bezpośrednio do klasy ZbiorLiczb). Warto teraz przypomnieć sobie
konstrukcję tej klasy zwracając szczególną uwagę na sposób pamiętania
zbioru (lista liczb). Poniżej jest podana treść metody operator=. Warto
zwrócić uwagę na wyraźnie widoczne dwie części: jedną zaczerpniętą z
destruktora klasy i drugą z konstruktora…
... zobacz całą notatkę



Komentarze użytkowników (0)

Zaloguj się, aby dodać komentarz