Czym jest konstruktor kopiujący w C++?
Konstruktor kopiujący to specjalny konstruktor klasy, który jest uruchamiany automatycznie podczas tworzenia nowego obiektu jako kopii już istniejącego obiektu.
Typowa postać konstruktora kopiującego:
NazwaKlasy(const NazwaKlasy& inny)
Parametr jest zwykle przekazywany przez referencję do stałej, aby uniknąć niepotrzebnego kopiowania i zabezpieczyć obiekt źródłowy przed zmianą.
Kiedy wywoływany jest konstruktor kopiujący?
Konstruktor kopiujący może zostać wywołany m.in. gdy:
- tworzymy obiekt na podstawie innego obiektu,
- przekazujemy obiekt do funkcji przez wartość,
- funkcja zwraca obiekt przez wartość.
Przykład:
class Punkt {
public:
int x;
Punkt(int wartosc) {
x = wartosc;
}
Punkt(const Punkt& inny) {
x = inny.x;
}
};
int main() {
Punkt p1(5);
Punkt p2 = p1; // wywołanie konstruktora kopiującego
}
Dlaczego jest ważny?
Domyślny konstruktor kopiujący tworzony przez kompilator kopiuje pola obiektu „jeden do jednego”. Dla prostych typów, np. int, zwykle wystarcza.
Problem pojawia się, gdy klasa zarządza zasobami, np. pamięcią dynamiczną, plikami lub uchwytami systemowymi. Wtedy często trzeba napisać własny konstruktor kopiujący, aby uniknąć błędów takich jak płytka kopia, wycieki pamięci albo podwójne zwolnienie zasobu.
Zapamiętaj
Podczas tworzenia kopii obiektu automatycznie uruchamiany jest konstruktor kopiujący, a nie destruktor, metoda statyczna ani metoda zaprzyjaźniona.