Tomasz Marks - Wydział MiNI PW
-1-
Programowanie Obiektowe
(j
ę
zyk C++)
Wykład 4.
Tomasz Marks - Wydział MiNI PW
-2-
operatory jako funkcje
vs
operatory jako metody
Tomasz Marks - Wydział MiNI PW
-3-
Operator jako funkcja vs metoda [0]
class CMPLX
{
......................................
......................................
public:
......................................
// operatory dwuargumentowe ( metody )
CMPLX
operator-
( CMPLX );
......................................
......................................
// operatory dwuargumentowe ( funkcje zaprzyja
ź
nione )
friend CMPLX
operator+
( CMPLX, CMPLX );
......................................
};
Tomasz Marks - Wydział MiNI PW
-4-
Operator jako funkcja vs metoda [1]
a
// operator + / funkcja zaprzyja
ź
niona (definicja)
CMPLX operator+ ( CMPLX a, CMPLX b )
{
CMPLX c;
c.Re = a.Re + b.Re; c.Im = a.Im + b.Im;
return c;
}
// operator - / metoda (definicja)
CMPLX CMPLX::operator- ( CMPLX b ) const
{
CMPLX c;
c.Re = Re - b.Re; c.Im = Im - b.Im;
return c;
}
Tomasz Marks - Wydział MiNI PW
-5-
Operator jako funkcja vs metoda [1a]
// operator + / funkcja zaprzyja
ź
niona (definicja)
CMPLX operator+ ( CMPLX a, CMPLX b )
{
CMPLX c ( a.Re + b.Re, a.Im + b.Im );
return c;
}
// operator - / metoda (definicja)
CMPLX CMPLX::operator- ( CMPLX b ) const
{
CMPLX c ( Re - b.Re, Im - b.Im );
return c;
}
Tomasz Marks - Wydział MiNI PW
-6-
Operator jako funkcja vs metoda [1b]
// operator + / funkcja zaprzyja
ź
niona (definicja)
CMPLX operator+ ( CMPLX a, CMPLX b )
{
return CMPLX ( a.Re + b.Re, a.Im + b.Im );
}
// operator - / metoda (definicja)
CMPLX CMPLX::operator- ( CMPLX b ) const
{
return CMPLX ( Re - b.Re, Im - b.Im );
}
Tomasz Marks - Wydział MiNI PW
-7-
Przypomnienie ...
• Ka
ż
da metoda niestatyczna ma dost
ę
p
do wska
ź
nika na obiekt, na rzecz
którego zostanie wywołana.
• Wska
ź
nik ten wyra
ż
any jest słowem
kluczowym
this
.
Tomasz Marks - Wydział MiNI PW
-8-
Operator jako funkcja vs metoda [2]
// operator + / metoda (definicja)
CMPLX CMPLX::operator+ ( CMPLX b ) const
{
CMPLX c;
c.Re = Re + b.Re;
c.Im = Im + b.Im;
return c;
}
// RÓWNOWA
ś
NE
// operator + / metoda (definicja)
CMPLX CMPLX::operator+ ( CMPLX b ) const
{
CMPLX c;
c.Re =
this->
Re + b.Re;
c.Im =
(*this).
Im + b.Im;
return c;
}
Tomasz Marks - Wydział MiNI PW
-9-
Operator jako funkcja vs metoda [3]
CMPLX A, B, C;
// operator + / funkcja zaprzyja
ź
niona (u
ż
ycie)
C = A + B;
// albo
C = operator+ ( A, B );
// operator - / metoda (u
ż
ycie)
C = A - B;
// albo
C = A.operator- ( B );
Tomasz Marks - Wydział MiNI PW
-10-
Operator jako funkcja vs metoda [4]
CMPLX A, B, C;
// operator + / funkcja zaprzyja
ź
niona (u
ż
ycie)
C = A + B;
// o.k.
C = A + 5.2;
// o.k. równowa
ż
ne
C = operator+ ( A, 5.2 );
// równowa
ż
ne
C = operator+ ( A, CMPLX ( 5.2 ) );
C = 5.2 + A;
// o.k. równowa
ż
ne
C = operator+ ( 5.2, A );
// równowa
ż
ne
C = operator+( CMPLX ( 5.2 ), A );
// operator - / metoda (u
ż
ycie)
C = A - B;
// o.k.
C = A - 5.2;
// o.k. równowa
ż
ne
C = A.operator- ( 5.2 );
// równowa
ż
ne
C = A.operator- ( CMPLX ( 5.2 ) );
C = 5.2 - A;
//
Ź
LE
równowa
ż
ne
C = (5.2).operator- ( A );
// metoda musi działa
ć
na rzecz obiektu klasy!!!
Tomasz Marks - Wydział MiNI PW
-11-
Operator przypisania dla klasy CMPLX [1]
Je
ż
eli zdecydujemy si
ę
zadeklarowa
ć
własny operator przypisania
class CMPLX
{
……………………….
public:
CMPLX& operator= ( const CMPLX& );
……………………….
};
to musimy poda
ć
jego implementacj
ę
(definicj
ę
).
Tomasz Marks - Wydział MiNI PW
-12-
Operator przypisania dla klasy CMPLX [2]
N.p.
CMPLX& CMPLX::operator= ( const CMPLX& rhs )
{
Re = rhs.Re;
Im = rhs.Im;
return *this;
}
albo
CMPLX& CMPLX::operator= ( const CMPLX& rhs )
{
if ( this != &rhs )
{
Re = rhs.Re;
Im = rhs.Im;
}
return *this;
}
Tomasz Marks - Wydział MiNI PW
-13-
Jeszcze o u
ż
yciu słowa kluczowego this
CMPLX::CMPLX ( double re, double im )
{
Re = re; Im = im;
// o.k.
}
CMPLX::CMPLX ( double Re, double Im )
{
Re = Re; Im = Im;
//
Ź
LE:
nazwy parametrów
}
// przesłaniaj
ą
nazwy pól
CMPLX::CMPLX ( double Re, double Im )
{
this
->Re = Re;
this
->Im = Im;
// o.k.
}
Tomasz Marks - Wydział MiNI PW
-14-
Operator indeksowy dla klasy CMPLX [1]
class CMPLX
{
……………………….
public:
// zamiast 4 prymitywnych metod dost
ę
powych
double getRe () const { return Re; }
double getIm () const { return Im; }
void setRe ( double re ) { Re = re; }
void setIm ( double im ) { Im = im; }
// lub 2 metod referencyjnych
double& refRe () { return Re; }
double& refIm () { return Im; }
// mo
ż
na zdefiniowa
ć
1 metod
ę
opisuj
ą
c
ą
operator indeksowy
double& operator [ ] ( int i ) { return i ? Im : Re; }
……………………….
};
Tomasz Marks - Wydział MiNI PW
-15-
Operator indeksowy dla klasy CMPLX [2]
{
……………………….
CMPLX A, B, C, T[5];
……………………….
C[0] = max ( A[0], A[1] );
// wyra
ż
a: C.Re = max ( A.Re, A.Im );
C[1] = B[1] - A[0];
// wyra
ż
a:
C.Im = B.Im - A.Re;
T[4][0] = 2.5;
// wyra
ż
a:
T[4].Re = 2.5;
Tomasz Marks - Wydział MiNI PW
-16-
Operatory ++ i -- dla klasy CMPLX
class CMPLX
{
……………………….
// funkcje zaprzyja
ź
nione
friend CMPLX& operator++ ( CMPLX& );
// przedrostkowy
friend CMPLX operator++ ( CMPLX&, int );
// przyrostkowy
……………………….
public:
……………………….
// metody
CMPLX& operator-- ( );
// przedrostkowy
CMPLX operator-- ( int );
// przyrostkowy
……………………….
};
Tomasz Marks - Wydział MiNI PW
-17-
// cmplx.cpp
// funkcje zaprzyja
ź
nione
CMPLX& operator++ ( CMPLX& z )
// przedrostkowy
{
z.Re++;
return z;
// zwraca referencj
ę
}
CMPLX operator++ ( CMPLX& z, int )
// przyrostkowy
{
CMPLX old( z.Re++, z.Im );
return old;
// zwraca nowy obiekt
}
// metody
CMPLX& CMPLX::operator-- ( )
// przedrostkowy
{
--Re;
return *this;
// zwraca referencj
ę
}
CMPLX CMPLX:: operator-- ( int )
// przyrostkowy
{
CMPLX old( Re--, Im );
return old;
// zwraca nowy obiekt
}
Tomasz Marks - Wydział MiNI PW
-18-
new i delete
Tomasz Marks - Wydział MiNI PW
-19-
PRZYPOMNIENIE:
Operatory new i delete [1]
int A;
static int B;
extern int C;
void fun ( int a )
{
int b, *p, *q;
static int c;
extern int D;
b = a;
p = new int;
// utworzenie zmiennej *p (warto
ść
0)
q = new int ( 4 );
// utworzenie zmiennej *q (warto
ść
4)
*p = 5; *q = 6;
delete p;
// zmienna *p "znika"
return;
// zmienna *q pozostanie niedost
ę
pny
}
Tomasz Marks - Wydział MiNI PW
-20-
Operatory new i delete [2]
CMPLX A;
static CMPLX B;
extern CMPLX C;
void fun ( CMPLX a )
{
CMPLX b, *p, *q;
static CMPLX c;
extern CMPLX D;
b = a;
p = new CMPLX;
// utworzenie obiektu *p (konstruktor bezparametrowy)
q = new CMPLX ( 2.5, 3.5 );
// utworzenie obiektu *q (konstruktor 2-parametrowy)
*p = 5; *q = 6;
delete p
;
// obiekt *p "znika" (destruktor)
return;
// obiekt *q pozostanie niedost
ę
pny
}
Tomasz Marks - Wydział MiNI PW
-21-
Operatory new i delete [3]
void fun ( CMPLX a )
{
int tab_i [ 5 ], *p;
CMPLX tab_C [ 5 ], *q;
p = new int [ 5 ];
// utworzenie tablicy o 5 elementach typu int
//
p[0], p[1], p[2], p[3], p[4]
q = new CMPLX [ 5 ];
// utworzenie tablicy o 5 elementach typu CMPLX
//
q[0], q[1], q[2], q[3], q[4]
……………………….
……………………….
delete [ ] p;
// wszystkie elementy (zmienne)
// tablicy wskazywanej przez p "znikaj
ą
"
delete [ ] q;
// wszystkie elementy (obiekty)
// tablicy wskazywanej przez q "znikaj
ą
" (destruktor)
return;
}
Tomasz Marks - Wydział MiNI PW
-22-
Operatory new i delete [4]
Operator new mo
ż
e te
ż
przyjmowa
ć
inne postaci, n.p.
Class *p, *q;
……………………….
p = new ( Placement ) Class;
// utworzenie obiektu
q = new ( Placement ) Class [ 5 ];
// utworzenie tablicy obiektów
……………………….
gdzie Placement jest list
ą
argumentów okre
ś
lonych w przeci
ąż
eniu operatora
new dla klasy Class.
Tego tematu nie b
ę
dziemy rozwija
ć
.
Tomasz Marks - Wydział MiNI PW
-23-
globalne / lokalne
statyczne / dynamiczne
Tomasz Marks - Wydział MiNI PW
-24-
PRZYPOMNIENIE:
Zmienne globalne / lokalne
int A;
// definicja zmiennej globalnej A
static int B;
// definicja zmiennej B lokalnej w tre
ś
ci pliku
extern int C;
// deklaracja zmiennej globalnej C zdefiniowanej
// by
ć
mo
ż
e w innym pliku
void fun ( int a )
// parametr a jest zmienn
ą
lokaln
ą
w tre
ś
ci funkcji
{
int b, *p, *q;
// definicja zmiennych b, p, q lokalnych w tre
ś
ci funkcji
static int c;
// definicja zmiennej c lokalnej w tre
ś
ci funkcji
extern int D;
// deklaracja zmiennej globalnej D zdefiniowanej
// by
ć
mo
ż
e w innym pliku
b = a;
p = new int;
// utworzenie zmiennej *p (warto
ść
0)
q = new int(4);
// utworzenie zmiennej *q (warto
ść
4)
*p = 5; *q = 6;
delete p;
// zmienna *p "znika"
return;
// zmienne a, b, p, q "znikaj
ą
",
// zmienna c zachowuje swoj
ą
warto
ść
// zmienna *q zachowuje swoj
ą
warto
ść
, ale pozostanie niedost
ę
pna
}
Tomasz Marks - Wydział MiNI PW
-25-
PRZYPOMNIENIE:
Zmienne statyczne / dynamiczne
int A;
// statyczna (warto
ść
0)
static int B;
// statyczna (warto
ść
0)
extern int C;
// statyczna (warto
ść
nieznana)
void fun ( int a )
// dynamiczna (automatyczna) (warto
ść
okr. argumentem)
{
int b, *p, *q;
// dynamiczne (automatyczne) (warto
ś
ci nieokre
ś
lone)
static int c;
// statyczna (warto
ść
0 przy pierwszym wywołaniu)
extern int D;
// statyczna (warto
ść
nieznana)
b = a;
p = new int;
// dynam. (kontrolowana) (warto
ść
0)
q = new int(4);
// dynam. (kontrolowana) (warto
ść
4)
*p = 5; *q = 6;
delete p;
// zmienna kontrolowana *p "znika"
return;
// zmienne automatyczne a, b, p, q "znikaj
ą
",
// zmienna statyczna c zachowuje swoj
ą
warto
ść
// zmienna kontr. *q zachowuje swoj
ą
warto
ść
, ale pozostanie niedost
ę
pna
}
Tomasz Marks - Wydział MiNI PW
-26-
Obiekty globalne / lokalne
CMPLX A;
// definicja obiektu globalnego A
static CMPLX B;
// definicja obiektu B lokalnego w tre
ś
ci pliku
extern CMPLX C;
// deklaracja obiektu globalnego C zdefiniowanego
// by
ć
mo
ż
e w innym pliku
void fun ( CMPLX a )
// parametr a jest obiektem lokalnym w tre
ś
ci funkcji
{
CMPLX b, *p, *q;
// definicja obiektu b i zmiennych p, q lokalnych w tre
ś
ci funkcji
static CMPLX c;
// definicja obiektu c lokalnego w tre
ś
ci funkcji
extern CMPLX D;
// deklaracja obiektu globalnego D zdefiniowanego
// by
ć
mo
ż
e w innym pliku
b = a;
p = new CMPLX;
// utworzenie obiektu *p (konstruktor bezparametrowy)
q = new CMPLX(2.5, 3.5);
// utworzenie obiektu *q (konstruktor 2-parametrowy)
*p = 5; *q = 6;
// równowa
ż
ne: *p = CMPLX(5,0); *q = CMPLX(6,0);
delete p;
// obiekt *p "znika"
return;
// obiekty a, b, p, q "znikaj
ą
",
// obiekt c zachowuje swoj
ą
warto
ść
// obiekt *q zachowuje swoj
ą
warto
ść
, ale pozostanie niedost
ę
pny
}
Tomasz Marks - Wydział MiNI PW
-27-
Obiekty statyczne / dynamiczne
CMPLX A;
// statyczny (konstruktor bezparametrowy)
static CMPLX B;
// statyczny (konstruktor bezparametrowy)
extern CMPLX C;
// statyczny (konstruktor nieznany)
void fun ( CMPLX a )
// dynamiczny (automatyczny) (konstruktor kopiuj
ą
cy)
{
CMPLX b, *p, *q;
// dynamiczny (automatyczny) b (konstruktor bezparametrowy)
// dynamiczne (automatyczne) p, q (warto
ś
ci nieokre
ś
lone)
static CMPLX c;
// statyczny (konstruktor bezparametrowy)
extern CMPLX D;
// statyczny (konstruktor nieznany)
b = a;
p = new CMPLX;
// dynam. (kontrolowany) (wart. okreslona konstruktorem bezp.)
q = new CMPLX(2.5,3.5);
// dynam. (kontrolowany) (wart. okreslona konstr. 2-par.)
*p = 5; *q = 6;
delete p;
// obiekt kontrolowany *p "znika"
return;
// obiekty automatyczne a, b i zmienne automatyczne p, q "znikaj
ą
",
// obiekt statyczny c zachowuje swoj
ą
warto
ść
// obiekt kontr. *q zachowuje swoj
ą
warto
ść
, ale pozostanie niedost
ę
pny
}
Tomasz Marks - Wydział MiNI PW
-28-
Koniec wykładu 4.