C++/Konstruktor i destruktor: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Gang65 (dyskusja | edycje)
Gang65 (dyskusja | edycje)
Nie podano opisu zmian
Linia 35:
Konstruktor może też przyjmować argumenty. Jak?<br>To zależy od sposobu w jaki tworzymy obiekt:
* jako obiekt
<source lang="cpp">
MojaKlasa obiekt(argumenty);
</source>
* jako wskaźnik do obiektu:
<source lang="cpp">
MojaKlasa* wsk = new MojaKlasa(argumenty);
</source>
 
Teraz powyższa klasa miesiąca może być stworzona z uwzględnieniem numeru miesiąca i roku:
Linia 56 ⟶ 60:
</source>
Aby utworzyć nowy obiekt tej klasy trzeba będzie napisać:
<source lang="cpp">
Miesiac styczen2000(1,2000);
</source>
lub jako wskaźnik do obiektu:
<source lang="cpp">
Miesiac* styczen2000 = new Miesiac(1,2000);
</source>
otrzymawszy w ten sposób kalendarz na styczeń.
 
Linia 149 ⟶ 157:
 
Zasady "przemiany" zwykłej funkcji do destruktora, są podobne do tych tyczących się konstruktora. Jedyna zmiana tyczy się nazwy funkcji: Musi się ona zaczynać od znaku '''tyldy''' - '''~'''.
<source lang="cpp">
class MojaKlasa
{
Linia 154 ⟶ 163:
~MojaKlasa();//a to - destruktor
};
</source>
Najczęstszą funkcją destruktora jest zwolnienie pamięci (zwykle poprzez zniszczenie wszystkich pól używanych przez ten obiekt).
{{Porada|Należy pamiętać, że jeżeli zamierzamy implementować dziedziczenie po klasie dla której piszemy destruktor to powinniśmy stworzyć destruktor '''wirtualny'''!
<source lang="cpp">
class MojaKlasa
{
Linia 161 ⟶ 172:
virtual ~MojaKlasa();//to jest destruktor wirtualny
};
</source>
Początkujący programiści często o tym zapominają, doprowadzając w ten sposób czasami do tzw. [[Wikipedia:pl:wyciek pamięci|wycieków pamięci]].
Dobrą praktyką jest tworzenie tylko '''destruktorów''' '''wirtualnych''' (patrz [[Programowanie:C++:Funkcje wirtualne|Funkcje wirtualne]]).}}
Linia 167 ⟶ 179:
=== Ćwiczenie 1 ===
Napisz definicje konstruktorów do poniższej klasy:
<source lang="cpp">
class Vector
{
Linia 177 ⟶ 190:
Vector(double alpha, double length);
};
</source>
Klasa ma reprezentować wektor w przestrzeni dwuwymiarowej, a konstruktory mają realizować
inicjalizację tego wektora. Pierwszy konstruktor powinien ustawiać wektor na wartość domyślną (0,0),
Linia 183 ⟶ 197:
=== Ćwiczenie 2 ===
Dopisz do kodu z poprzedniego ćwiczenia konstruktor kopiujący.
<source lang="cpp">
Vector(const Vector &vector);
</source>
Po wykonaniu tego ćwiczenia zastanów się, czy napisanie konstruktora kopiującego było konieczne. Jeżeli nie jesteś pewien - napisz program który testuje działanie Twojego konstruktora kopiującego i sprawdź jak program działa bez niego. Wyjaśnij dlaczego konstruktor kopiujący nie jest potrzebny.
 
=== Ćwiczenie 3 ===
Poniższa klasa miała implementować dowolnej wielkości tablicę obiektów klasy Vector z poprzednich ćwiczeń. Niestety okazało się że powoduje wycieki pamięci - programista zapomniał o napisaniu destruktora:
 
<source lang="cpp">
class VectorsArray
{
Linia 209 ⟶ 227:
}
};
</source>
Do powyższej klasy dopisz definicję destruktora. Nie zapomnij o dealokacji pamięci!