119

119



Po

class Napis

{

private:

const int m_cchTest; int m_cch; char *m_pch;

void lnicjNapis(const char *pch, int cch); public:

Napis(void): m_cch(0), m_cchTest(10)

{

m_pch = NULL;

}

Napis(const Napis &napis): m_cchTest(10)

{

lnicjNapis(napis.m_pch, napis.m_cch);

}

Napis(char *sz): m_cchTest(10)

{

lnicjNapis(sz, strlen(sz));

}

~Napis(void)

{

if(m_pch)

delete m_pch;

}

};

Zarówno konstruktor kopiowania, jak i operator przypisania są automatycznie dołączane przez kompilator. Jeśli przydzielamy pamięć wewnątrz klasy (lub raczej alokujemy pamięć, która pozostaje wewnątrz klasy — a nie pamięć, którą tymczasowo tworzymy i usuwamy w obrębie funkcji), to trzeba będzie utworzyć konstruktor kopiowania i przeciążyć operator przypisania. Jest to spowodowane tym, że domyślny konstruktor kopiowania i operator przypisania nie skopiują przydzielonej pamięci, a tylko wskaźniki do niej.

Zwróćmy uwagę na kod z fragmentu „Przed”. Utworzona klasa ma zmienną składową o nazwie m_pch będącą wskaźnikiem do bufora znakowego. Domyślny konstruktor kopiowania kopiuje wskaźnik, ale nie kopiuje samego bufora. Uzyskujemy wówczas dwa wskaźniki odnoszące się do tego samego obszaru pamięci. A przecież musimy skopiować również pamięć. Należy w tym celu utworzyć konstruktor kopiowania z funkcjami składowymi przydzielającymi nowy bufor pamięci i kopiującymi do niego zawartość pierwszego bufora.


Wyszukiwarka

Podobne podstrony:
Język C++ - praktyczne wskazówki Po class Napis { private: const int m_cchTest; int m_cch; char
~Napis(void){ if(m_pch) delete m_pch;} }; Po class Napis{ private: const int m_cchTest; int
KlasyPo class Napis { private: const int m_cchTest; public: Napis(void) : m_cchTest(10){}}; Zgodnie
Po class Uwaga { private: int m_nLicznik; public: Uwaga(void) : m_nLicznik(1){} void UstawLicznik(in
19 p07 #include <stdio.h> class próba{ private: int *pi_Dane; public: próba(); -próba()
19 p08 #include <stdio.h> class próba { private: int *pi_Dane; public: próba(); -próba()
093 TIF Tworzenie stałych operatorów 80 kompilowanie kodu Przed class Napis { char & operator[]
}}; class NiePochodna{ private: int m_i; float m_f1; float m_f2; public: NiePochodnaO :

więcej podobnych podstron