Przeci ˛
a˙zanie operatorów (odsłona pierwsza)
Bogdan Kreczmer
ZPCiR IIAiR PWr
pokój 307 budynek C3
bogdan.kreczmer@pwr.wroc.pl
Copyright c
2005–2008 Bogdan Kreczmer
⋆
⋆
Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udost ˛epiony pod warun-
kiem wykorzystania wył ˛
acznie do własnych prywatnych potrzeb i mo˙ze on by´c kopiowany wył ˛
acznie w cało´sci, razem z niniejsz ˛
a
stron ˛
a tytułow ˛
a.
Przeci ˛
a˙zanie 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
x = b, y = e, z;
z = dodaj(x,y);
}
Tabliczka działania
a
b
e
a
b
e
a
b
e
a
b
e
a
b
e
W oparciu o zadan ˛
a tabliczk˛e działania mo˙zemy definiowa´c wybran ˛
a operacj ˛e dla zadanego zbioru
elementów.
Copyright c
2005–2008 Bogdan Kreczmer
Przeci ˛
a˙zanie operatorów (odsłona pierwsza)
1
Przeci ˛
a˙zanie 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;
}
Tabliczka działania
a
b
e
a
b
e
a
b
e
a
b
e
a
b
e
Działanie to mo˙zna wprost zaimplementowa´c definiuj ˛
ac przeci ˛
a˙zenie operatora ’+’. Dzi ˛eki temu
otrzymujemy naturalny zapis działania stosuj ˛
ac zwykł ˛
a notacj ˛e dodawania.
Copyright c
2005–2008 Bogdan Kreczmer
Przeci ˛
a˙zanie operatorów (odsłona pierwsza)
2
Przeci ˛
a˙zanie 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);
}
Przeci ˛
a˙zenie operatora dodawania mo˙zemy równie˙z wywoła´c wprost jako funkcj ˛e.
Copyright c
2005–2008 Bogdan Kreczmer
Przeci ˛
a˙zanie operatorów (odsłona pierwsza)
3
Przeci ˛
a˙zanie 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 przeci ˛
a˙ze ´n operatorów oraz ich jawne wywoływanie mo˙zna uto˙zsamia´c z
mechanizmami definiowania i wywoływania zwykłych funkcji.
Copyright c
2005–2008 Bogdan Kreczmer
Przeci ˛
a˙zanie operatorów (odsłona pierwsza)
4
Przeci ˛
a˙zanie 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˙zliwo´s´c jawnego wywoływania przeci ˛
a˙ze ´n pozwala na zobrazowanie składania i kolejno´sci ich
wywoła ´n w operacjach zło˙zonych z uwzgl ˛ednieniem nawiasów i priorytetów poszczególnych opera-
torów.
Copyright c
2005–2008 Bogdan Kreczmer
Przeci ˛
a˙zanie operatorów (odsłona pierwsza)
5
Pytania i ´cwiczenia
1. Bior ˛
ac pod uwag ˛e wcze´sniej zdefiniowany typ Element nale˙zy okre´sli´c czy poni˙zej
wykonana operacja jest poprawna (bez implementacji przeci ˛
a˙zenia operatora ’+’)?
Element x = e, y = a, z;
z = (Element)(x + y);
Je˙zeli tak, to jaki jest wynik tej operacji? Czy mo˙zna j ˛
a zapisa´c bez konieczno´sci rzuto-
wania na typ Element? Co jest typem warto´sci sumy w wyra˙zeniu powy˙zej?
2. Je˙zeli zapis wyra˙zenia powy˙zej jest poprawny (bez przeci ˛
a˙zania operatora ’+’), to jaki
b ˛edzie jego wynik gdy
x = b
? Je˙zeli nie, to co nale˙zy uczyni´c aby zapis ten był po-
prawny?
3. Zakładaj ˛
ac, ˙ze operator ’+’ nie jest przeci ˛
a˙zony, to czy zapis poni˙zszego wyra˙zenia
logicznego jest poprawny?
Element x = a, y = b;
x + y == (int)x + (int)y;
Je˙zeli tak, to jaki b ˛edzie ono miało wynik? Je˙zeli nie, to co nale˙zy uczyni´c, aby było ono
poprawne.
Copyright c
2005–2008 Bogdan Kreczmer
Przeci ˛
a˙zanie operatorów (odsłona pierwsza)
6
Pytania i ´cwiczenia
4. Bior ˛
ac pod uwag ˛e wcze´sniej zdefiniowan ˛
a tabliczk˛e? działa ´n na str. 1 oraz zdefinio-
wane przeci ˛
a˙zenie operatora ’+’ dla typu Element nale˙zy okre´sli´c, czy wyra˙zenie lo-
giczne w pytaniu nr 3 b ˛edzie poprawne? Je´sli tak, to jaki b ˛edzie jego wynik? Je´sli nie,
to co nale˙zy uczyni´c, aby było ono poprawne?
Copyright c
2005–2008 Bogdan Kreczmer
Przeci ˛
a˙zanie operatorów (odsłona pierwsza)
7