Poznaj C++ w$ godziny0213

Poznaj C++ w$ godziny0213



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.

Listing 14.6. Operator przypisania

1:    // Listing 14.6

2:    // Operator przypisania

3:    i

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:


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0190 Zaawansowane referencje i wskaźniki 179 ZAWSZE NIGDY Zawsze przekazuj p
Poznaj C++ w$ godziny0030 14 Godzina 1 P: Czy można ignorować ostrzeżenia kompilatora (wamings) O: W
Poznaj C++ w$ godziny0156 145Zaawansowane wykorzystanie wskaźników W liniach 6-13 deklarujemy klasę
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$ godziny0180 169Zaawansowane referencje i wskaźniki 39:    FunkcjaDruga(
Poznaj C++ w$ godziny0182 Zaawansowane referencje i wskaźniki 171 int PobierzWiek() const { return j
Poznaj C++ w$ godziny0184 Zaawansowane referencje i wskaźniki 173 Ponieważ wiemy, że obiekt nie będz
Poznaj C++ w$ godziny0186 175Zaawansowane referencje i wskaźniki Wskaźnik plnt jest deklarowany i in
Poznaj C++ w$ godziny0188 177Zaawansowane referencje i wskaźniki 18:    ZwyklyKot::Zw
Poznaj C++ w$ godziny0035 Program w C++ 19Funkcje ■ain() jest funkcją specjalną. Jest automatycznie
Poznaj C++ w$ godziny0181 170 Godzina 12 wyrzucany z pamięci poprzez wywołanie destruktora. Widać to
POZNAJĘ CYFERKI Z PIESKIEM FIDO (14) Ile orzechów kokosowych zrzuciła małpa? A ile zostało ich na dr
IMG177 177 14.4.3. Prostowanie trójfazowę^ednopołówkowe Schemat układu pomiarowego jest pokazany na
img177 177 14.4.3. Prostowanie trójfazowę^ednopołówkowe Schemat układu pomiarowego jest pokazany na
s05 (14) +3 cm mógłby nostąpić wówczas, gdyby odpalenie naboju było możliwe w trakcie dosyłonia go d
IMG!52 PRZEBICIE Obraz zniszczenia przez przebicie stopy fundamentowej przedstawiono na rysunku 13,4

więcej podobnych podstron