Temat: Operatory poza klasą

Na zajęciach definiowaliśmy operatory wewnątrz klas. Pierwszym argumentem każdego z operatorów był wówczas obiekt naszej klasy. Drugi argument mógł być zdefiniowany (dla operatorów dwuargumentowych jak +=, =, +) lub nie (dla operatora ++).

Ale operatory możemy również definiować poza klasami, tak jak poza klasami możemy definiować zwykłe funkcje.

Na przykład dla ćwiczenia możemy zdefiniować operator ==, który porówna nam ze sobą dwa obiekty klasy Liczba. Do uznania je za równe wystarczy nam równość pól wartosc:

bool operator==(Liczba& liczba1, Liczba& liczba2) {
    return (liczba1.dajWartosc() == liczba2.dajWartosc());
}

Tak zdefiniowany operator umieszczamy na przykład w pliku z programem głównym i możemy go już użyć w funkcji main():

if (a==b) {
    cout << "Liczby rowne" << endl;
} else {
    cout << "Liczby rozne" << endl;
}

Do operatora warto dodać informacje o tym, że jego argumenty nie zostają zmienione, czyli słówko const:

bool operator==(const Liczba& liczba1, const Liczba& liczba2) {
    return (liczba1.dajWartosc() == liczba2.dajWartosc());
}

Oczywiście powyższy przypadek można równie dobrze zdefiniować wewnątrz klasy Liczba, więc jeszcze nie widzimy uzasadnienia dla stosowania tego sposobu.

Okaże się on jednak przydatny, jeżeli będziemy chcieli na przykład pomnożyć liczbę przez walutę.

Liczba a(10, 2);
Waluta w(10, 3, "PLN", 1.0);

Dla takiego przypadku:

w = w * a;

możemy zdefiniować operator * w klasie Waluta, ponieważ "wie" ona czym jest klasa Liczba.

Nie możemy zrobić tego jednak dla takiego przypadku:

w = a * w;

Ponieważ trzeba by to zrobić w klasie Liczba, a klasa Liczba nie wie, że ma potomka Waluta.

Pozostaje nam więc zdefiniowanie tego operatora poza klasami:

Waluta operator*(const Liczba& liczba, const Waluta& waluta) {
    return Waluta(liczba.dajWartosc()*waluta.dajWartosc(), 3, waluta.dajWalute(), waluta.dajPrzelicznik());
}

Zachęcam do przetestowania tego we własnych programach.