Poznaj C++ w$ godziny0198

Poznaj C++ w$ godziny0198



Zaawansowane funkcje 189

Inicjalizacja obiektów

Dotychczas, wartości wewnętrznych zmiennych klasy były ustalane wewnątrz treści konstruktorów. Jednakże, każdy konstruktor powinien składać się z dwóch części, inicjalizującej i treści.

Większość zmiennych można zainicjować w dowolnej z tych części, albo poprzez inic-jalizację w części inicjalizującej, albo przez przypisanie wartości w treści konstruktora. Jednak bardziej elegancko i bardziej efektywnie jest wykorzystać do tego część inicjalizującą. Oto przykład prawidłowej inicjalizacji zmiennych wewnętrznych:

KOT():    //    nazwa    konstruktora i    parametry

jegoWiek(5),    //    lista    inicjalizacji

jegoWaga(8)

{ )    //    treść    konstruktora

Po nawiasie zamykającym listę parametrów konstruktora postaw dwukropek.

Następnie wpisz nazwę zmiennej i w nawiasach podaj wyrażenie, którego wartość ma być nadana tej zmiennej. Inicjalizację zmiennych oddzielaj przecinkami. Pamiętaj, że referencje i stałe muszą być inicjalizowane, nie można im przypisywać wartości. W celu nadania im wartości trzeba wykorzystać metodę podaną powyżej. Powiedzieliśmy sobie, że inicjalizacja zmiennych wewnętrznych jest bardziej efektywna niż przypisywanie im wartości. Żeby to wytłumaczyć musimy najpierw dokładniej poznać zasady działania konstruktora kopiującego.

Konstruktor kopiujący

Podobnie jak w przypadku zwykłego konstruktora i destruktora, kompilator dostarcza również kopiujący konstruktor domyślny. Konstruktor kopiujący jest wywoływany w momencie tworzenia kopii obiektu danej klasy.

Kiedy obiekt jest przekazywany przez wartość, jako parametr lub ewentualnie wartość zwracana, to jest wykonywana chwilowa, robocza kopia tego obiektu. Jeśli jest to obiekt klasy zdefiniowanej przez użytkownika, to jest wywoływany konstruktor kopiujący tej klasy.

Konstruktor kopiujący ma tylko jeden parametr: referencje do obiektu tej samej klasy. Dobrze jest deklarować ten parametr jako const, gdyż konstruktor kopiujący nie ma prawa zmieniać zwartości obiektu. Oto przykład deklaracji konstruktora kopiującego:

KOT(const KOT Skotek);

Konstruktor kopiujący z klasy KOT pobiera stałą referencję do istniejącego obiektu klasy KOT. Zadaniem tego konstruktora jest wykonanie w pamięci kopii obiektu kotek.

Domyślny (dostarczany przez kompilator) konstruktor kopiujący, wykonuje kopię każdej zmiennej wewnętrznej obiektu źródłowego i umieszcza w nowym obiekcie. Jest to bardzo „płytkie” kopiowanie i o ile w przypadku zwykłych zmiennych będzie działać prawidłowo, to w przypadku np. wskaźników całkowicie zawiedzie, gdyż skopiowane zostaną adresy zawarte we wskaźnikach.

Inicjalizacja obiektów

Dotychczas, wartości wewnętrznych zmiennych klasy były ustalane wewnątrz treści konstruktorów. Jednakże, każdy konstruktor powinien składać się z dwóch części, inicjalizującej i treści.

Większość zmiennych można zainicjować w dowolnej z tych części, albo poprzez inic-jalizację w części inicjalizującej, albo przez przypisanie wartości w treści konstruktora. Jednak bardziej elegancko i bardziej efektywnie jest wykorzystać do tego część inicjalizującą. Oto przykład prawidłowej inicjalizacji zmiennych wewnętrznych:

KOT():    //    nazwa    konstruktora i    parametry

jegoWiek(5),    //    lista    inicjalizacji

j egoWaga(8)

{ }    //    treść    konstruktora

Po nawiasie zamykającym listę parametrów konstruktora postaw dwukropek. Następnie wpisz nazwę zmiennej i w nawiasach podaj wyrażenie, którego wartość ma być nadana tej zmiennej. Inicjalizację zmiennych oddzielaj przecinkami. Pamiętaj, że referencje i stale muszą być inicjalizowane, nie można im przypisywać wartości. W celu nadania im wartości trzeba wykorzystać metodę podaną powyżej. Powiedzieliśmy sobie, że inicjalizacja zmiennych wewnętrznych jest bardziej efektywna niż przypisywanie im wartości. Żeby to wytłumaczyć musimy najpierw dokładniej poznać zasady działania konstruktora kopiującego.

Konstruktor kopiujący

Podobnie jak w przypadku zwykłego konstruktora i destruktora, kompilator dostarcza również kopiujący konstruktor domyślny. Konstruktor kopiujący jest wywoływany w momencie tworzenia kopii obiektu danej klasy.

Kiedy obiekt jest przekazywany przez wartość, jako parametr lub ewentualnie wartość zwracana, to jest wykonywana chwilowa, robocza kopia tego obiektu. Jeśli jest to obiekt klasy zdefiniowanej przez użytkownika, to jest wywoływany konstruktor kopiujący tej klasy.

Konstruktor kopiujący ma tylko jeden parametr: referencje do obiektu tej samej klasy. Dobrze jest deklarować ten parametr jako eonst, gdyż konstruktor kopiujący nie ma prawa zmieniać zwartości obiektu. Oto przykład deklaracji konstruktora kopiującego:

KOT(eonst KOT Skotek);

Konstruktor kopiujący z klasy KOT pobiera stałą referencję do istniejącego obiektu klasy KOT. Zadaniem tego konstruktora jest wykonanie w pamięci kopii obiektu kotek.

Domyślny (dostarczany przez kompilator) konstruktor kopiujący, wykonuje kopię każdej zmiennej wewnętrznej obiektu źródłowego i umieszcza w nowym obiekcie. Jest to bardzo „płytkie” kopiowanie i o ile w przypadku zwykłych zmiennych będzie działać prawidłowo, to w przypadku np. wskaźników całkowicie zawiedzie, gdyż skopiowane zostaną adresy zawarte we wskaźnikach.


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0194 Zaawansowane funkcje 185 57: Prost.RysujKsztalt(); 58: cout «
Poznaj C++ w$ godziny0196 Zaawansowane funkcje 187 53:    } 54:    cou
Poznaj C++ w$ godziny0200 Zaawansowane funkcje 191Listing 13.3. Konstruktory
Poznaj C++ w$ godziny0202 Zaawansowane funkcje 193 W liniach 53 i 54 wypisywany jest wiek obydwu KOT
Poznaj C++ w$ godziny0121 Zaawansowane sterowanie programem 109 W liniach 12-15 wprowadzamy wartości
Poznaj C++ w$ godziny0184 Zaawansowane referencje i wskaźniki 173 Ponieważ wiemy, że obiekt nie będz
Poznaj C++ w$ godziny0190 Zaawansowane referencje i wskaźniki 179 ZAWSZE NIGDY Zawsze przekazuj p
Poznaj C++ w$ godziny0119 Zaawansowane sterowanie programem 107Pętle while Pętla while pozwala na po
Poznaj C++ w$ godziny0123 Zaawansowane sterowanie programem 111 W linii 32 obliczana jest reszta z d
Poznaj C++ w$ godziny0125 Zaawansowane sterowanie programem Listing 8.6. Pomijanie pętli while 1:
Poznaj C++ w$ godziny0127 Zaawansowane sterowanie programem 115Listing 8.8. Jeszcze raz pętla while
Poznaj C++ w$ godziny0129 Zaawansowane sterowanie programem 117Listing 8.10. Demonstracja wielokrotn
Poznaj C++ w$ godziny0131 Zaawansowane sterowanie programem 119EFEKT DZIAŁANIA: No to ile razy sie p
Poznaj C++ w$ godziny0133 Zaawansowane sterowanie programem 121 Jaki znak?
Poznaj C++ w$ godziny0135 Zaawansowane sterowanie programem 153 20:    break; 21: &nb
Poznaj C++ w$ godziny0158 Zaawansowane wykorzystanie wskaźników 147 32:    } 33: 34:
Poznaj C++ w$ godziny0160 Zaawansowane wykorzystanie wskaźników 149Do czego służy wskaźnik this Gdyb
Poznaj C++ w$ godziny0162 Zaawansowane wykorzystanie wskaźników 151 Zaawansowane wykorzystanie wskaź
Poznaj C++ w$ godziny0182 Zaawansowane referencje i wskaźniki 171 int PobierzWiek() const { return j

więcej podobnych podstron