i usuwamy w granicach funkcji), to będziemy musieli utworzyć konstruktor kopiowania i przeciążyć operator przypisania. Dlaczego? Domyślny konstruktor i operator przypisania nie kopiują pamięci, którą przydzielamy. Kopiują one zaledwie wskaźniki j do pamięci. j
We fragmencie „Przed” klasa ma zmienną składową o nazwie m_pch, zawierającą i wskaźnik do bufora znaków. Domyślny operator przypisania kopiuje wskaźnik. Nie kopiuje jednak samego bufora pamięci. W ten sposób uzyskujemy dwa wskaźniki od- S noszące się do tego samego obszaru pamięci. Gdy jedna z klas zostaje usunięta, wów- m czas zwalnia się pamięć. Druga klasa staje się wówczas bezużyteczna, ponieważ B wskazuje pamięć, która przed chwilą została zwolniona. Musimy zatem utworzyć S-również kopię wskazywanej pamięci. Przeciążenie operatora przypisania umożliwi ■ utworzenie funkcji składowej, która przydzieli nowy bufor pamięci i skopiuje do niego ■ zawartość bufora źródłowego. w
Informacje na ten temat można znaleźć również we wskazówce 94. Jest tam opisana analogiczna metoda dotycząca konstruktora kopiowania.
Przykład: klasa String w pliku String.cpp :
pisanie szybkiego kodu; unikanie nieoczekiwanych wyników
Przed
const Napis& operator=(const Napis &napis)
Po
const Napis& operator= (const Napis &napis)
ReinicjNapis(napis.m_pch, napis.m_cch);
return *this;
Należy pamiętać o tym, że operator może działać na sobie samym. Na przykład można napisać instrukcję:
x=x;