Tomasz Marks - Wydział MiNI PW
-1-
Programowanie Obiektowe
(j
ę
zyk C++)
Wykład 3.
Tomasz Marks - Wydział MiNI PW
-2-
predefiniowane
konstruktory,
destruktor
i operator przypisania
Tomasz Marks - Wydział MiNI PW
-3-
Predefiniowane konstruktory, destruktor
i operator przypisania
// cmplx.h
class CMPLX
{
double Re, Im;
public:
// konstruktor bezparametrowy
CMPLX ( );
// konstruktor kopiuj
ą
cy
CMPLX ( const CMPLX& );
// destruktor
~CMPLX ( );
// operator przypisania
CMPLX& operator= ( const CMPLX& );
void Set (double=0, double=0 );
void Read ( );
void Write ( ) const;
double Abs ( ) const;
friend CMPLX operator+ ( CMPLX, CMPLX );
};
Tomasz Marks - Wydział MiNI PW
-4-
Predefiniowane konstruktory, destruktor
i operator przypisania
// ilustracja realizacji metod predefiniowanych
……………….
// konstruktor bezparametrowy
CMPLX ::CMPLX ( ) { }
// konstruktor kopiuj
ą
cy
CMPLX :: CMPLX ( const CMPLX& arg ) { Re = arg.Re; Im = arg.Im; }
// destruktor
CMPLX :: ~CMPLX ( ) { }
// operator przypisania
CMPLX& CMPLX :: operator= ( const CMPLX& rhs )
{
Re = rhs.Re;
Im = rhs.Im;
return *
this
;
}
Tomasz Marks - Wydział MiNI PW
-5-
Do zapami
ę
tania…
• 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
.
• Wyra
ż
enie
*this
oznacza obiekt, na
rzecz którego 'pracuje' metoda.
Tomasz Marks - Wydział MiNI PW
-6-
nasze
konstruktory
i destruktor
Tomasz Marks - Wydział MiNI PW
-7-
Konstruktory i destruktor (1)
// cmplx.h
class CMPLX
{
double Re, Im;
public:
CMPLX ( );
CMPLX ( const CMPLX& );
CMPLX ( double, double );
CMPLX ( double );
~CMPLX ( );
void Set (double=0, double=0 );
void Read ( );
void Write ( ) const;
double Abs ( ) const;
friend CMPLX operator+ ( CMPLX, CMPLX );
};
Tomasz Marks - Wydział MiNI PW
-8-
Konstruktory i destruktor (2)
// cmplx.cpp
……………….
// konstruktor bezparametrowy
CMPLX ::CMPLX ( ) { Re = Im = 0; }
// konstruktor kopiuj
ą
cy
CMPLX :: CMPLX ( const CMPLX& arg ) { Re = arg.Re; Im = arg.Im; }
// konstruktor 2-parametrowy (double,double)
CMPLX :: CMPLX ( double re, double im ) { Re = re; Im = im; }
// konstruktor 1-parametrowy (double)
CMPLX :: CMPLX ( double re ) { Re = re; Im = 0; }
// destruktor
CMPLX :: ~CMPLX ( ) { }
Tomasz Marks - Wydział MiNI PW
-9-
Konstruktory i destruktor (3)
{
CMPLX a;
// u
ż
ycie konstr. bezparametrowego
a.Write( );
// ( 0, 0 )
a.Set(2, 1.5);
a.Write( );
// ( 2, 1.5 )
CMPLX b(3.2, 5.3);
// u
ż
ycie konstr. (double,double)
b.Write() ;
// ( 3.2, 5.3 )
CMPLX c(4.1);
// u
ż
ycie konstr. (double)
c.Write( );
// ( 4.1, 0 )
CMPLX d(a), e=b;
// u
ż
ycie konstr. kopiuj
ą
cego
d.Write( );
// ( 2, 1.5 ), jak a
e.Write( );
// ( 3.2, 5.3 ), jak b
}
// dla ka
ż
dego obiektu utworzonego w bloku
// zostanie (niejawnie) wywołany destruktor
Tomasz Marks - Wydział MiNI PW
-10-
Konstruktory i destruktor (4)
UWAGA!!!
CMPLX f( );
To
nie jest
deklaracja obiektu f z u
ż
yciem kostruktora
bezparametrowego.
To
jest
deklaracja bezparametrowej funkcji f zwracaj
ą
cej
warto
ść
typu CMPLX.
Tomasz Marks - Wydział MiNI PW
-11-
Konstruktory i destruktor dla klasy Class
(1) Konstruktory / destruktor zwracaj
ą
typ void, ale
przy ich deklaracji / definicji słowa void nie
piszemy.
(2) Nazw
ą
ka
ż
dego konstruktora jest Class,
kostruktorów mo
ż
e by
ć
wiele.
(3) Nazw
ą
destruktora jest ~Class, destruktor jest
tylko jeden.
(4) Je
ż
eli nie zdefiniowano
ż
adnego konstruktora, to
kompilator doł
ą
czy do definicji klasy konstruktor
bezparametrowy o pustej tre
ś
ci.
Tomasz Marks - Wydział MiNI PW
-12-
Konstruktory i destruktor klasy Class
(5) Je
ż
eli nie zdefiniowano destruktora, to kompilator
doł
ą
czy do definicji klasy destruktor o pustej tre
ś
ci.
(6) Je
ż
eli zdefiniowano jakikolwiek konstruktor, to
konstruktor bezparametrowy b
ę
dzie dost
ę
pny tylko
wtedy, gdy jawnie b
ę
dzie zdefiniowany konstruktor
daj
ą
cy si
ę
wywoła
ć
bez parametrów.
(7) Kompilator dostarcza równie
ż
domy
ś
lny konstruktor
kopiuj
ą
cy o deklaracji
Class ( const Class& );
Wykonuje on kopi
ę
ka
ż
dej zmiennej wewn
ę
trznej
obiektu
ź
ródłowego i umieszcza w nowym obiekcie
(tzw. kopiowanie płytkie).
Tomasz Marks - Wydział MiNI PW
-13-
Konstruktory i destruktor dla klasy Class
(8) Konstruktor kopiuj
ą
cy jest wywoływany, gdy
tworzony jest obiekt danej klasy, który ma by
ć
kopi
ą
zadanego obiektu tej klasy. Ma to miejsce
n.p. gdy
- opracowywana jest deklaracja z inicjatorem,
- obiekt jest przekazywany do funkcji
jako argument (przez warto
ść
),
- obiekt jest zwracany jako warto
ść
funkcji.
Tomasz Marks - Wydział MiNI PW
-14-
Konstruktory [1]
// cmplx.h
class CMPLX
{
double Re, Im;
public:
CMPLX ( );
CMPLX ( const CMPLX& );
CMPLX ( double, double );
CMPLX ( double );
~CMPLX ( );
void Set (double=0, double=0 );
void Read ( );
void Write ( ) const;
double Abs ( ) const;
friend CMPLX operator+ ( CMPLX, CMPLX );
};
Tomasz Marks - Wydział MiNI PW
-15-
Konstruktory [2]
// cmplx.h
class CMPLX
{
double Re, Im;
public:
CMPLX ( const CMPLX& );
CMPLX ( double=0, double=0 );
~CMPLX ( );
void Set (double=0, double=0 );
void Read ( );
void Write ( ) const;
double Abs ( ) const;
friend CMPLX operator+ ( CMPLX, CMPLX );
};
Tomasz Marks - Wydział MiNI PW
-16-
Metody i funkcje (deklaracje)
// cmplx.h
class CMPLX
{
double Re, Im;
public:
CMPLX ( const CMPLX& );
CMPLX ( double=0, double=0 );
~CMPLX ( );
............................
double Abs ( ) const;
void
Read
( );
// metoda
void
Write
( ) const;
// metoda
friend CMPLX
Add
( CMPLX, CMPLX );
// fun. zaprzyja
ź
niona
};
Tomasz Marks - Wydział MiNI PW
-17-
Metody i funkcje (definicje)
// cmplx.cpp
……………….
// metoda Read
void CMPLX ::
Read
( )
{
cin >> Re >> Im;
}
// metoda Write
void CMPLX ::
Write
( ) const
{
cout << "(" << Re << ''," << Im << ")" << endl;
}
// funkcja zaprzyja
ź
niona Add
CMPLX
Add
( CMPLX a, CMPLX b )
{
a.Re += b.Re;
a.Im += b.Im;
return a;
}
Tomasz Marks - Wydział MiNI PW
-18-
Metody i funkcje (u
ż
ycie)
// myprog.cpp
……………….
……………….
{
CMPLX a, b, c;
a.Read( );
b.Read( );
c = Add(a, b);
c.Write( );
……………….
Tomasz Marks - Wydział MiNI PW
-19-
Funkcje / Operatory (deklaracje)
// cmplx.h
#include <iostream>
class CMPLX
{
double Re, Im;
public:
CMPLX ( const CMPLX& );
CMPLX ( double=0, double=0 );
~CMPLX ();
double Abs () const;
......................................
// operatory / funkcje zaprzyja
ź
nione
friend CMPLX
operator+
( CMPLX, CMPLX );
friend istream&
operator>>
(istream&, CMPLX&);
friend ostream&
operator<<
(ostream&, const CMPLX&);
};
Tomasz Marks - Wydział MiNI PW
-20-
Funkcje / Operatory (definicje)
// cmplx.cpp
……………….
// operator
+
/ funkcja zaprzyja
ź
niona
CMPLX
operator+
( CMPLX a, CMPLX b )
{
a.Re += b.Re; a.Im += b.Im;
return a;
}
// operator
>>
/ funkcja zaprzyja
ź
niona
istream&
operator>>
( istream& inp, CMPLX& z )
{
inp >> z.Re >> z.Im;
return inp;
}
// operator
<<
/ funkcja zaprzyja
ź
niona
ostream&
operator<<
( ostream& out, const CMPLX& z )
{
out << "(" << z.Re << ''," << z.Im << ")" << endl;
return out;
}
Tomasz Marks - Wydział MiNI PW
-21-
Funkcje / Operatory (u
ż
ycie) [1]
// myprog.cpp
……………….
……………….
{
CMPLX a, b, c;
cin >> a;
cin >> b;
c = a + b;
cout << c;
……………….
Tomasz Marks - Wydział MiNI PW
-22-
Funkcje / Operatory (u
ż
ycie) [2]
// myprog.cpp
……………….
……………….
{
CMPLX a, b, c;
cin >> a >> b;
c = a + b;
cout << c;
……………….
Tomasz Marks - Wydział MiNI PW
-23-
Funkcje / Operatory (u
ż
ycie) [3]
// myprog.cpp
……………….
……………….
{
CMPLX a, b;
cin >> a >> b;
cout << a + b;
……………….
Tomasz Marks - Wydział MiNI PW
-24-
Funkcje / Operatory (u
ż
ycie) [4]
// myprog.cpp
……………….
……………….
{
CMPLX a, b;
operator>> (
operator>>(cin,a),
b
);
operator<< (
cout
,
operator+(a,b)
);
……………….
Tomasz Marks - Wydział MiNI PW
-25-
Funkcje / Operatory (u
ż
ycie) [5]
// myprog.cpp
……………….
……………….
{
CMPLX a(2.5), b(1,3), c(a), T[5];
// a, b, c – obiekty klasy CMPLX (typu CMPLX)
// T[5] – tablica 5 obiektów klasy CMPLX
T[ 0 ] = a; T[ 1 ] = b;
int i;
for ( i = 2; i < 5; ++i ) cin >> T[ i ];
CMPLX s;
for ( int j = 0; j < 5; ++j ) s = s + T[ j ];
cout << s;
……………….
Tomasz Marks - Wydział MiNI PW
-26-
UWAGA:
Pojedyncze obiekty
(a, b, c)
mog
ą
by
ć
inicjowane
dowolnymi konstruktorami.
Wszystkie elementy tablicy
(T[0], T[1], T[2], T[3], T[4])
s
ą
inicjowane konstruktorem bezparametrowym i nie ma tu
innej mo
ż
liwo
ś
ci.
Tomasz Marks - Wydział MiNI PW
-27-
OPERATORY
Tomasz Marks - Wydział MiNI PW
-28-
Zestawienie operatorów
lewa
<< >>
12
lewa
+ -
(dwuargumentowe)
13
lewa
.* ->*
15
lewa
* / %
14
prawa
++ --
(przedrostkowe)
-
+ * &
(jednoargumentowe)
new delete
(typ) sizeof ~ !
16
prawa
++ --
(przyrostkowe)
. -> [ ] ( ) typ
typeid
dynamic_cast static_cast
reinterpret_cast const_cast
17
lewa
::
18
Ł
ą
cz.
Operatory
Pr.
Tomasz Marks - Wydział MiNI PW
-29-
Zestawienie operatorów c.d.
lewa
< <= > >=
11
lewa
,
1
prawa
throw
2
prawa
= @=
( @ oznacza * / % + - << >> & | ^ )
3
lewa
? :
4
lewa
||
5
lewa
&&
6
lewa
|
7
lewa
&
9
lewa
^
8
lewa
== !=
10
Ł
ą
cz.
Operatory
Pr.
Tomasz Marks - Wydział MiNI PW
-30-
Definiowanie operatorów [1]
(1)
Mo
ż
na deklarowa
ć
funkcje/metody definiuj
ą
ce
znaczenie nast
ę
puj
ą
cych operatorów:
+ - * / % ^ & | ~ ! < > <= >= == !=
<< >> && || ++ -- -> ->* , [ ] ( ) new delete =
oraz operatorów postaci
@=
gdzie
@
jest jednym z operatorów:
+ - * / % ^ & | << >>
Tomasz Marks - Wydział MiNI PW
-31-
Definiowanie operatorów [2]
(2)
Nie wolno deklarowa
ć
funkcji/metod definiuj
ą
cych
znaczenie operatorów:
:: .* . ?: sizeof typeid
xxxxx_cast
(3)
Operatory
[ ] ( ) -> = @=
musz
ą
by
ć
deklarowane jako metody niestatyczne
(zapewnia to,
ż
e ich pierwszy argument b
ę
dzie
L-warto
ś
ci
ą
)
Tomasz Marks - Wydział MiNI PW
-32-
Definiowanie operatorów [3]
(4)
Operatory:
=
(przypisanie)
&
(utworzenie wskazania)
,
(poł
ą
czenie)
stosowane do obiektów klas maj
ą
swoje pierwotnie
zdefiniowane (predefiniowane) znaczenie.
Tomasz Marks - Wydział MiNI PW
-33-
Definiowanie operatorów [4]
(5)
Funkcja operatorowa musi mie
ć
co najmniej
jeden parametr typu definiowalnego (np. klasy).
(nie dotyczy to operatorów
new
i
delete
).
(5a)
Metody spełniaj
ą
to wymaganie automatycznie.
(5b)
Wynika st
ą
d w szczególno
ś
ci,
ż
e nie mo
ż
na
zmieni
ć
znaczenia operatorów okre
ś
lonych dla
wbudowanych typów danych.
Tomasz Marks - Wydział MiNI PW
-34-
Definiowanie operatorów [5]
(6)
Niezale
ż
nie od utworzonych definicji, formalne
własno
ś
ci operatorów (priorytet, ł
ą
czno
ść
, liczba
argumentów) pozostaj
ą
niezmienione.
(7)
Operatory
++
i
--
mog
ą
wyst
ę
powa
ć
w postaci
przyrostkowej i przedrostkowej.
W celu odró
ż
nienia postaci przyrostkowej
wprowadza si
ę
dla niej umownie drugi parametr
w deklaracji / definicji.
Tomasz Marks - Wydział MiNI PW
-35-
Koniec wykładu 3.