Konstruktory i destruktory
Bogdan Kreczmer
ZPCiR IIAiR PWr
pokój 307 budynek C3
bogdan.kreczmer@pwr.wroc.pl
Copyright ©2005 2009 Bogdan Kreczmer
Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostępniony pod
warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany wyłącznie w całości, razem z
niniejszą stroną tytułową.
1
Inicjalizacja obiektu
Kto zgadnie co ten program wyświetli? >8-|
#include
using namespace std;
struct Wektor { float x, y; };
int main()
{
Wektor W;
cout << W. x << ", " << W. y << endl;
}
Konstruktory i destruktory
1
Inicjalizacja obiektu
Kto zgadnie co ten program wyświetli? >8-|
#include
using namespace std;
struct Wektor { float x, y; };
int main()
{
Wektor W;
cout << W. x << ", " << W. y << endl;
}
Jedno jest pewne. Tego nikt nie zgadnie. ;-)
Konstruktory i destruktory
2
Inicjalizacja obiektu
#include
using namespace std;
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor() { x = 0; y = 0; } // . . . Ta metoda inicjalizuje obiekt.
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
Wektor W;
cout<}
Konstruktory i destruktory
2
Inicjalizacja obiektu
#include
using namespace std;
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor() { x = 0; y = 0; } // . . . Ta metoda inicjalizuje obiekt.
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
Wektor W;
cout<}
Teraz sposób inicjalizacji jest już jednoznacznie określony.
Konstruktory i destruktory
3
Konstruktory
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor() { x = 0; y = 0; }
Wektor( float x, float y) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
Wektor W(4,5); // . . . . . Inicjalizujemy obiekt tak jak chcemy.
cout<}
Konstruktory i destruktory
3
Konstruktory
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor() { x = 0; y = 0; }
Wektor( float x, float y) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
Wektor W(4,5); // . . . . . Inicjalizujemy obiekt tak jak chcemy.
cout<}
Konstruktory pozwalają na wybór sposobu inicjalizacji obiektu.
Konstruktory i destruktory
4
Konstruktory
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( float x, float y) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
Wektor V; // . . . . . . . Taka deklaracja jest teraz zabroniona.
Wektor W(4,5);
. . .
}
Konstruktory i destruktory
4
Konstruktory
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( float x, float y) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
Wektor V; // . . . . . . . Taka deklaracja jest teraz zabroniona.
Wektor W(4,5);
. . .
}
Deklaracja konstruktora unieważnia konstruktor domyślny.
Konstruktory i destruktory
5
Konstruktory
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( float x = 0, float y = 0) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
Wektor V; // . . . . Teraz deklaracja ta jest już dopuszczalna.
Wektor W(4,5);
. . .
}
Konstruktory i destruktory
5
Konstruktory
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( float x = 0, float y = 0) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
Wektor V; // . . . . Teraz deklaracja ta jest już dopuszczalna.
Wektor W(4,5);
. . .
}
Konstruktory, podobnie jak metody, mogą zawierać domyślne wartości parametrów.
Konstruktory i destruktory
6
Konstruktory
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( float x, float y) { x = x; y = y; }
private :
Wektor() { x = y = 0; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
Wektor V; // Ponownie deklaracja ta staje siÄ™ niedopuszczalna.
Wektor W(4,5);
. . .
}
Konstruktory i destruktory
6
Konstruktory
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( float x, float y) { x = x; y = y; }
private :
Wektor() { x = y = 0; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
Wektor V; // Ponownie deklaracja ta staje siÄ™ niedopuszczalna.
Wektor W(4,5);
. . .
}
Sekcja private i protected pozwalają uniemożliwić korzystanie z wybranych kon-
struktorów na poziomie publicznym.
Konstruktory i destruktory
7
Konstruktory
. . .
struct Wektor {
float x, y;
. . .
Wektor Dodaj(constWektor "pW);
private :
Wektor() { x = y = 0; } // Ta deklaracja uniemożliwia deklaracji obiektu poza daną klasą.
};
Wektor Wektor ::Dodaj( constWektor "pW)
{
Wektor W; // . . . . . . . . . . Tutaj można korzystać z prywatnego konstruktora.
W. x = x + pW >x; W. y = y + pW >y;
return W;
}
. . .
Konstruktory i destruktory
7
Konstruktory
. . .
struct Wektor {
float x, y;
. . .
Wektor Dodaj(constWektor "pW);
private :
Wektor() { x = y = 0; } // Ta deklaracja uniemożliwia deklaracji obiektu poza daną klasą.
};
Wektor Wektor ::Dodaj( constWektor "pW)
{
Wektor W; // . . . . . . . . . . Tutaj można korzystać z prywatnego konstruktora.
W. x = x + pW >x; W. y = y + pW >y;
return W;
}
. . .
Sekcje private i protected nie ograniczają dostępu do konstruktorów oraz innych
metod i pól na poziomie metod danej klasy.
Konstruktory i destruktory
8
Prywatny konstruktor
struct KlasaSkladowa { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
private :
KlasaSkladowa( ) { }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct KlasaFinalna { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladowa Pole;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
KlasaFinalna ObKlasyF;
}
Czy ten obiekt można utworzyć?
Konstruktory i destruktory
9
Prywatny konstruktor
struct KlasaSkladowa { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
friend class KlasaFinalna;
private :
KlasaSkladowa( ) { }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct KlasaFinalna { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladowa Pole;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main()
{
KlasaFinalna ObKlasyF;
}
Do konstruktorów stosują się wszystkie reguły i mechanizmy dostępu jakie wykorzystywane są w
przypadku zwykłych metod.
Konstruktory i destruktory
10
Konstruktory
. . .
struct Wektor { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor() { x = y = 0; }
Wektor( float x, float y ) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . .
Wektor Tab1[3];
Wektor Tab2[3] = { Wektor(1,1), Wektor(2,1), Wektor(4,2) };
Wektor Tab3[3] = { Wektor(2,2) };
Wektor Tab4[3] = { Wektor(2,2), Wektor(), Wektor(5,5) };
. . .
Konstruktory i destruktory
10
Konstruktory
. . .
struct Wektor { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor() { x = y = 0; }
Wektor( float x, float y ) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . .
Wektor Tab1[3];
Wektor Tab2[3] = { Wektor(1,1), Wektor(2,1), Wektor(4,2) };
Wektor Tab3[3] = { Wektor(2,2) };
Wektor Tab4[3] = { Wektor(2,2), Wektor(), Wektor(5,5) };
. . .
Przy deklarowaniu tablic domyślnie używany jest konstruktor bezparametryczny.
Konstruktory i destruktory
11
Konstruktory
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( ) { x = y = 0; }
Wektor( float x, float y ) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wektor Dodaj1( Wektor W1, Wektor W2 )
{ W1. x += W2. x; W1. y += W2. y; return W1; }
Wektor Dodaj2( Wektor W1, Wektor W2 )
{ Wektor W(W1. x+W2. x, W1. y+W2. y); return W; }
Wektor Dodaj3( Wektor W1, Wektor W2 )
{ return Wektor(W1. x+W2. x, W1. y+W2. y); }
. . .
Konstruktory i destruktory
11
Konstruktory
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( ) { x = y = 0; }
Wektor( float x, float y ) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wektor Dodaj1( Wektor W1, Wektor W2 )
{ W1. x += W2. x; W1. y += W2. y; return W1; }
Wektor Dodaj2( Wektor W1, Wektor W2 )
{ Wektor W(W1. x+W2. x, W1. y+W2. y); return W; }
Wektor Dodaj3( Wektor W1, Wektor W2 )
{ return Wektor(W1. x+W2. x, W1. y+W2. y); }
. . .
Konstruktory pozwalają także na bardziej zwięzły zapis i lepszą implementację funkcji i metod.
Konstruktory i destruktory
12
Lista inicjalizacyjna
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int Pole;
public :
PrzykladKlasy( );
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Konstruktory i destruktory
12
Lista inicjalizacyjna
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int Pole;
public :
PrzykladKlasy( );
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dwie możliwe implementacje konstruktora
PrzykladKlasy::PrzykladKlasy( ) PrzykladKlasy::PrzykladKlasy( ): Pole(0)
{ { }
Pole = 0;
}
Pole klasy może zostać zainicjalizowane na dwa sposoby, albo w ciele konstruktora, albo też poprzez
listę inicjalizacyjną. Niektóre rodzaje pól mogą być zainicjalizowane tylko i wyłącznie z poziomu listy
inicjalizacyjnej.
Konstruktory i destruktory
13
Lista inicjalizacyjna - różnice i podobieństwa
int Zmienna; int Zmienna = 0;
Zmienna = 0;
PrzykladKlasy::PrzykladKlasy( ) PrzykladKlasy::PrzykladKlasy( ): Pole(0)
{ }
{
Pole = 0;
}
Umieszczenie inicjalizatora w liście inicjalizacyjnej konstruktora powoduje przypisanie wartości polu
w momencie jego utworzenia.
Konstruktory i destruktory
14
Lista inicjalizacyjna
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int Pole;
public :
PrzykladKlasy( int Param );
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PrzykladKlasy::PrzykladKlasy( int Param ): Pole(Param)
{ }
Do inicjalizatorów można przekazać wartość poprzez parametr wywołania konstruktora.
Konstruktory i destruktory
15
Lista inicjalizacyjna
class PrzedzialLiczb { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int WartoscMini;
int WartoscMaks;
public :
PrzedzialLiczb( int Mini, int Maks );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PrzedzialLiczb::PrzedzialLiczb( int Mini, int Maks ):
WartoscMini(Mini), WartoscMaks(Maks)
{ }
Lista inicjalizacyjna może zawierać dowolną ilość inicjalizatorów. Uruchamiane są one w kolejności
tworzenia pól, która jest zgodna z porządkiem ich deklaracji w klasie. Nie jest błędem podanie ini-
cjalizatorów w innej kolejności. Jednak nie wpłynie ona na kolejność ich wywołań.
Aby nie wprowadzać nieporozumień, kolejność inicjalizatorów powinna zawsze odpowiadać faktycz-
nej kolejności ich uruchamiania.
Konstruktory i destruktory
16
Lista inicjalizacyjna
class PrzedzialLiczb { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int WartoscMini;
int WartoscMaks;
public :
PrzedzialLiczb( int Mini, int Maks );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PrzedzialLiczb::PrzedzialLiczb( int Mini, int Maks ):
WartoscMini(), WartoscMaks()
{ }
A teraz jaką wartością zostaną zainicjalizowane pola klasy?
Konstruktory i destruktory
17
Konstruktor i destruktor
struct PustaKlasa { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PustaKlasa( ) { cout<< ++PustaKlasa <<"PustaKlasa( ) { cout<< --PustaKlasa <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout << Witajcie !!! :-) << endl;
PustaKlasa Ob;
cout << Zegnajcie !!! :-( << endl;
}
Konstruktory i destruktory
17
Konstruktor i destruktor
struct PustaKlasa { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PustaKlasa( ) { cout<< ++PustaKlasa <<"PustaKlasa( ) { cout<< --PustaKlasa <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout << Witajcie !!! :-) << endl;
PustaKlasa Ob;
cout << Zegnajcie !!! :-( << endl;
Wynik działania:
}
Witajcie !!! :-)
++PustaKlasa
Zegnajcie !!! :-(
--PustaKlasa
W przypadku zmiennych lokalnych (automatycznych) konstruktor wywoływany jest w chwili tworze-
nia obiektu, tj. w miejscu jego deklaracji. Destruktor natomiast jest wywoływany w miejscu końca
zakresu ważności deklaracji.
Konstruktory i destruktory
18
Konstruktory w klasach złożonych
struct KlasaSkladnikaA { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaA( ) { cout<< ++KlasaSkladnikaA <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct KlasaSkladnikaB { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaB( ) { cout<< ++KlasaSkladnikaB <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct KlasaFinalna { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaA PoleA;
KlasaSkladnikaB PoleB;
KlasaFinalna( ) { cout<< ++KlasaFinalna <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
KlasaFinalna Ob;
}
Konstruktory i destruktory
18
Konstruktory w klasach złożonych
struct KlasaSkladnikaA { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaA( ) { cout<< ++KlasaSkladnikaA <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct KlasaSkladnikaB { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaB( ) { cout<< ++KlasaSkladnikaB <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct KlasaFinalna { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaA PoleA;
KlasaSkladnikaB PoleB;
KlasaFinalna( ) { cout<< ++KlasaFinalna <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
++KlasaSkladnikaA
{
++KlasaSkladnikaB
KlasaFinalna Ob;
}
++KlasaFinalna
Pola tworzone są zgodnie z kolejnością ich deklaracji.
Konstruktory i destruktory
19
Konstruktory i destruktory w klasach złożonych
struct KlasaSkladnikaA { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaA( ) { cout<< ++KlasaSkladnikaA <<"KlasaSkladnikaA( ) { cout<< --KlasaSkladnikaA <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct KlasaSkladnikaB { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaB( ) { cout<< ++KlasaSkladnikaB <<"KlasaSkladnikaB( ) { cout<< --KlasaSkladnikaB <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct KlasaFinalna { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaA PoleA;
KlasaSkladnikaB PoleB;
KlasaFinalna( ) { cout<< ++KlasaFinalna <<"KlasaFinalna( ) { cout<< --KlasaFinalna <}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
KlasaFinalna Ob;
cout << Witajcie i zegnajcie !!! << endl;
}
Konstruktory i destruktory
19
Konstruktory i destruktory w klasach złożonych
struct KlasaSkladnikaA { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaA( ) { cout<< ++KlasaSkladnikaA <<"KlasaSkladnikaA( ) { cout<< --KlasaSkladnikaA <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct KlasaSkladnikaB { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaB( ) { cout<< ++KlasaSkladnikaB <<"KlasaSkladnikaB( ) { cout<< --KlasaSkladnikaB <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct KlasaFinalna { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaSkladnikaA PoleA;
KlasaSkladnikaB PoleB;
KlasaFinalna( ) { cout<< ++KlasaFinalna <<"KlasaFinalna( ) { cout<< --KlasaFinalna <}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
++KlasaSkladnikaA
int main( )
++KlasaSkladnikaB
{
KlasaFinalna Ob;
++KlasaFinalna
cout << Witajcie i zegnajcie !!! << endl;
Witajcie i zegnajcie !!!
}
--KlasaFinalna
--KlasaSkladnikaB
--KlasaSkladnikaA
Konstruktory i destruktory
20
Konstruktory lista inicjalizacji
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( ) { x = y = 0; }
Wektor( float x, float y ) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct Odcinek { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wektor Po, Pn;
Odcinek( );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Odcinek::Odcinek( ): Po(-1,-1), Pn(1,1) // Lista inicjalizująca wymusza wywołanie konstruktorów
{ }
. . .
Konstruktory i destruktory
20
Konstruktory lista inicjalizacji
. . .
struct Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float x, y;
Wektor( ) { x = y = 0; }
Wektor( float x, float y ) { x = x; y = y; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
struct Odcinek { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wektor Po, Pn;
Odcinek( );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Odcinek::Odcinek( ): Po(-1,-1), Pn(1,1) // Lista inicjalizująca wymusza wywołanie konstruktorów
{ }
. . .
Lista inicjalizująca pozwala wymusić wywołanie zadanego konstruktora dla poszczególnych składni-
ków obiektu. Kolejność składników listy powinna odpowiadać kolejności deklaracji pól klasy.
Konstruktory i destruktory
21
Obiekty tworzone w sposób dynamiczny
struct PustaKlasa { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PustaKlasa( ) { cout<< ++PustaKlasa <<"PustaKlasa( ) { cout<< --PustaKlasa <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout << Witajcie !!! :-) << endl;
PustaKlasa "wOb = new PustaKlasa;
cout << Zegnajcie !!! :-( << endl;
}
Konstruktory i destruktory
21
Obiekty tworzone w sposób dynamiczny
struct PustaKlasa { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PustaKlasa( ) { cout<< ++PustaKlasa <<"PustaKlasa( ) { cout<< --PustaKlasa <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout << Witajcie !!! :-) << endl;
PustaKlasa "wOb = new PustaKlasa;
cout << Zegnajcie !!! :-( << endl;
Wynik działania:
}
Witajcie !!! :-)
++PustaKlasa
Zegnajcie !!! :-(
W przypadku obiektów tworzonych w sposób dynamiczny, to programista decyduje kiedy je znisz-
czyć. Zakończenie programu bez wykonania tej operacji nie spowoduje automatycznego urucho-
mienia destruktorów tych obiektów.
Konstruktory i destruktory
22
Obiekty tworzone w sposób dynamiczny
struct PustaKlasa { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PustaKlasa( ) { cout<< ++PustaKlasa <<"PustaKlasa( ) { cout<< --PustaKlasa <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout << Witajcie !!! :-) << endl;
PustaKlasa "wOb = new PustaKlasa;
delete wOb;
cout << Zegnajcie !!! :-( << endl;
}
Konstruktory i destruktory
22
Obiekty tworzone w sposób dynamiczny
struct PustaKlasa { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PustaKlasa( ) { cout<< ++PustaKlasa <<"PustaKlasa( ) { cout<< --PustaKlasa <}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout << Witajcie !!! :-) << endl;
PustaKlasa "wOb = new PustaKlasa;
delete wOb;
Wynik działania:
cout << Zegnajcie !!! :-( << endl;
Witajcie !!! :-)
}
++PustaKlasa
--PustaKlasa
Zegnajcie !!! :-(
Operator delete można zastosować tylko do zmiennej wskaznikowej w dowolnym miejscu programu.
Jedynym warunkiem poprawności jego wywołania jest to, aby pod danym adresem istniał obiekt
utworzony dynamicznie z wykorzystaniem operatora new.
Konstruktory i destruktory
23
Obiekty tworzone w sposób dynamiczny
struct PustaKlasa { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PustaKlasa( ) { }
<"PustaKlasa( ) { }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
int"wTab = new int[ 30 ];
PustaKlasa "wOb = new PustaKlasa[ 20 ];
delete [ ] wTab;
delete [ ] wOb;
}
W przypadku tworzenia w sposób dynamiczny tablic obiektów stosując operator delete należy jawnie
wskazać, że usuwana jest tablica obiektów, a nie pojedynczy obiekt. Rozmiar tablicy nie jest istotny.
Konstruktory i destruktory
24
Pytania i ćwiczenia
1. Dana jest następująca definicja klasy
class Wektor {
float x, y;
private:
Wektor() { x = y = 0; }
protected:
Wektor( float xx, float yy ) { x = xx; y = yy; }
};
Czy obiekt klasy Wektor zdefiniowany jak wyżej, można zadeklarować funkcjimain? Czy
można go zadeklarować jako obiekt globalny (tzn. jako zmienną globalną).
Konstruktory i destruktory
Wyszukiwarka
Podobne podstrony:
1996 07 Szkoła konstruktorów
2002 07 Szkoła konstruktorów klasa II
Konstrukcje obudow glosnikowych MiT 07
1997 07 Szkoła konstruktorów
2010 07 Szkoła konstruktorów klasa III
2002 07 Szkoła konstruktorówid!645
1999 07 Szkoła konstruktorów
2001 07 Szkoła konstruktorów klasa II
2010 07 Szkoła konstruktorów klasa II
08 konstruktor kopiujacy prez
2003 07 Szkoła konstruktorów klasa II
07 prez Ax=0
2000 07 Szkoła konstruktorów klasa II
więcej podobnych podstron