Przeci ˛a˙zanie operatorów (odsłona pierwsza)
Transkrypt
Przeci ˛a˙zanie operatorów (odsłona pierwsza)
Przeciażanie ˛ operatorów (odsłona pierwsza) Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 [email protected] c 2005–2008 Bogdan Kreczmer⋆ Copyright ⋆ Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostepiony ˛ pod warun- kiem wykorzystania wyłacznie ˛ do własnych prywatnych potrzeb i może on być kopiowany wyłacznie ˛ w całości, razem z niniejsza˛ strona˛ tytułowa. ˛ Przeciażanie ˛ operatorów enum Element { e, a, b }; Element TabliczkaDzialania[3][3] = { { b, e, a }, { e, a, b }, { a, b, e } }; Element dodaj( Element x, Element y ) { return TabliczkaDzialania[x][y]; } int main( ) { Element Tabliczka działania a b e a b e b e a e a b a b e x = b, y = e, z; z = dodaj(x,y); } W oparciu o zadana˛ tabliczk˛e działania możemy definiować wybrana˛ operacje˛ dla zadanego zbioru elementów. c 2005–2008 Bogdan Kreczmer Copyright Przeciażanie ˛ operatorów (odsłona pierwsza) 1 Przeciażanie ˛ operatorów Element TabliczkaDzialania[3][3] = { { b, e, a }, { e, a, b }, { a, b, e } }; Element operator + ( Element x, Element y ) { return TabliczkaDzialania[x][y]; } int main( ) { Element Tabliczka działania a b e a b e b e a e a b a b e x = b, y = e, z; z = x + y; } Działanie to można wprost zaimplementować definiujac ˛ przeciażenie ˛ operatora ’+’. Dzieki ˛ temu otrzymujemy naturalny zapis działania stosujac ˛ zwykła˛ notacje˛ dodawania. c 2005–2008 Bogdan Kreczmer Copyright Przeciażanie ˛ operatorów (odsłona pierwsza) 2 Przeciażanie ˛ operatorów Element TabliczkaDzialania[3][3] = { { b, e, a }, { e, a, b }, { a, b, e } }; Element operator + ( Element x, Element y ) { return TabliczkaDzialania[x][y]; } int main( ) { Element x = b, y = e, z; z = x + y; z = operator+ (x, y); } Przeciażenie ˛ operatora dodawania możemy również wywołać wprost jako funkcje. ˛ c 2005–2008 Bogdan Kreczmer Copyright Przeciażanie ˛ operatorów (odsłona pierwsza) 3 Przeciażanie ˛ operatorów Element TabliczkaDzialania[3][3] = { { b, e, a }, { e, a, b }, { a, b, e } }; Element dodaj( Element x, Element y ) { return TabliczkaDzialania[x][y]; Element operator + ( Element x, Element y ) { return TabliczkaDzialania[x][y]; } int main( ) { Element x = b, y = e, z; z = x + y; z = operator+ (x, y); z = dodaj(x, y); } Mechanizmy definiowania przeciaże ˛ ń operatorów oraz ich jawne wywoływanie można utożsamiać z mechanizmami definiowania i wywoływania zwykłych funkcji. c 2005–2008 Bogdan Kreczmer Copyright Przeciażanie ˛ operatorów (odsłona pierwsza) 4 Przeciażanie ˛ operatorów ... int main( ) { Element x = b, y = e, z; z = x + (y + x); z = operator+ (x, operator+ (y, x) ); z = dodaj(x, dodaj(y, x) ); } Możliwość jawnego wywoływania przeciaże ˛ ń pozwala na zobrazowanie składania i kolejności ich wywołań w operacjach złożonych z uwzglednieniem ˛ nawiasów i priorytetów poszczególnych operatorów. c 2005–2008 Bogdan Kreczmer Copyright Przeciażanie ˛ operatorów (odsłona pierwsza) 5 Pytania i ćwiczenia 1. Biorac ˛ pod uwage˛ wcześniej zdefiniowany typ Element należy określić czy poniżej wykonana operacja jest poprawna (bez implementacji przeciażenia ˛ operatora ’+’)? Element x = e, y = a, z; z = (Element)(x + y); Jeżeli tak, to jaki jest wynik tej operacji? Czy można ja˛ zapisać bez konieczności rzutowania na typ Element? Co jest typem wartości sumy w wyrażeniu powyżej? 2. Jeżeli zapis wyrażenia powyżej jest poprawny (bez przeciażania ˛ operatora ’+’), to jaki bedzie ˛ jego wynik gdy x = b? Jeżeli nie, to co należy uczynić aby zapis ten był poprawny? 3. Zakładajac, ˛ że operator ’+’ nie jest przeciażony, ˛ to czy zapis poniższego wyrażenia logicznego jest poprawny? Element x = a, y = b; x + y == (int)x + (int)y; Jeżeli tak, to jaki bedzie ˛ ono miało wynik? Jeżeli nie, to co należy uczynić, aby było ono poprawne. c 2005–2008 Bogdan Kreczmer Copyright Przeciażanie ˛ operatorów (odsłona pierwsza) 6 Pytania i ćwiczenia 4. Biorac ˛ pod uwage˛ wcześniej zdefiniowana˛ tabliczk˛e? działań na str. 1 oraz zdefiniowane przeciażenie ˛ operatora ’+’ dla typu Element należy określić, czy wyrażenie logiczne w pytaniu nr 3 bedzie ˛ poprawne? Jeśli tak, to jaki bedzie ˛ jego wynik? Jeśli nie, to co należy uczynić, aby było ono poprawne? c 2005–2008 Bogdan Kreczmer Copyright Przeciażanie ˛ operatorów (odsłona pierwsza) 7