204 Godzina 14
przez wskaźniki zawarte w obiekcie oryginalnym. Widać to było na rysunku 13-.1
(wróć do tego rozdziału jeśli masz jakieś wątpliwości).
Podobnie ma się sprawa z operatorem przypisania. Pojawia się tu jednak dodatkowy problem. Obiekt kotJeden już istnieje i ma już zarezerwowaną pamięć. Pamięć tę trzeba będzie zwolnić.
Pierwsza rzecz, którą trzeba koniecznie zrobić przy implementacji operatora przypisania jest zwolnienie pamięci przypisanej do wskaźników obiektu docelowego. Co się jednak stanie gdy przypiszemy obiekt do siebie samego:
kotDwa = kotDwa;
Nie jest to może często spotykane przypisanie ale z punktu widzenia C++ całkowicie poprawne, trzeba zatem zapewnić, aby się poprawnie wykonywało. Takie przypisanie zdarza się czasem przy wykorzystywaniu wskaźników i referencji.
Jeśli nie obsłużysz takiego przypisania to spowoduje ono, że obiekt kotDwa sam się skasuje z pamięci. I kiedy będzie on już gotowy do przepisania, okaże się, że pamięć, która go zawierała, została już zwolniona.
Aby uniknąć takiej sytuacji, operator przypisania musi sprawdzać, czy aby nie przypisujemy obiektu do siebie samego. Niezastąpiony jest tutaj wskaźnik this. Listing 14.6 demonstruje poprawną implementację operatora przypisania.
1: // Listing 14.6
2: // Operator przypisania
4: #include <iostream.h>
5:
6: class KOT
7: {
8: public:
9: KOT(); // domyoelny konstruktor
10: // pominięty konstruktori kopiuj'cy i destruktor
11: int PobierzWiekO const { return *jegoWiek; }
12: int PobierzWaga() const { return *jegoWaga; }
13: void UstawWiek(int wiek)’{ *jegoWiek = wiek; }
14: KOT operator=(const KOT 6);
15:
16: private:
17: int *jegoWiek;
18: int *jegoWaga;
19: ) ;
20:
21: KOT::KOT()
22: {
23: jegoWiek = new int;
24: jegoWaga = new int;
25: *jegoWiek = 5;
26: *jegoWaga = 9;
27: }
28: przez wskaźniki zawarte w obiekcie oryginalnym. Widać to było na rysunku 13.1 (wróć do tego rozdziału jeśli masz jakieś wątpliwości).
Podobnie ma się sprawa z operatorem przypisania. Pojawia się tu jednak dodatkowy problem. Obiekt kotJeden już istnieje i ma już zarezerwowaną pamięć. Pamięć tę trzeba będzie zwolnić.
Pierwsza rzecz, którą trzeba koniecznie zrobić przy implementacji operatora przypisania jest zwolnienie pamięci przypisanej do wskaźników obiektu docelowego. Co się jednak stanie gdy przypiszemy obiekt do siebie samego: kotDwa = kotDwa;
Nie jest to może często spotykane przypisanie ale z punktu widzenia C++ całkowicie poprawne, trzeba zatem zapewnić, aby się poprawnie wykonywało. Takie przypisanie zdarza się czasem przy wykorzystywaniu wskaźników i referencji.
Jeśli nie obsłużysz takiego przypisania to spowoduje ono, że obiekt kotDwa sam się skasuje z pamięci. I kiedy będzie on już gotowy do przepisania, okaże się, że pamięć, która go zawierała, została już zwolniona.
Aby uniknąć takiej sytuacji, operator przypisania musi sprawdzać, czy aby nie przypisujemy obiektu do siebie samego. Niezastąpiony jest tutaj wskaźnik this. Listing 14.6 demonstruje poprawną implementację operatora przypisania.
Listing 14.6. Operator przypisania
1: // Listing 14.6
2: // Operator przypisania
3: ;
4: ftinclude Ciostream. h>
5:
6: class KOT
7: {
8: public:
9: KOT(); II domycalny konstruktor
10: II pominięty konstruktor;kopiuj‘cy i destruktor
11: int PobierzWiek() const { return ‘jegoWiek; }
12: int PobierzWaga(> const ( return ‘jegoWaga; )
13: void OstawWiek(int wiek)'{ ‘jegoWiek = wiek; )
14: KOT operator=(const KOT 5);
15:
16: private:
17: int ‘jegoWiek;
18: int ‘jegoWaga;
19: );
20:
21: KOT::KOT()
22: {
23: jegoWiek = new int;
24: jegoWaga = new int;
25: ‘jegoWiek = 5;
26: ‘jegoWaga = 9;
27: )
28: