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.