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