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

Podobne dokumenty