logo

Destruktory w C++

Co to jest destruktor?

Destruktor to funkcja składowa instancji, która jest wywoływana automatycznie za każdym razem, gdy obiekt ma zostać zniszczony. Oznacza to, że destruktor jest ostatnią funkcją, która zostanie wywołana przed zniszczeniem obiektu.



  • Destruktor jest także specjalną funkcją składową, taką jak konstruktor. Destruktor niszczy obiekty klas utworzone przez konstruktora.
  • Destructor ma taką samą nazwę jak nazwa klasy poprzedzona symbolem tyldy (~).
  • Nie jest możliwe zdefiniowanie więcej niż jednego destruktora.
  • Destruktor to tylko jeden ze sposobów zniszczenia obiektu utworzonego przez konstruktora. Dlatego destruktor nie może być przeciążony.
  • Destruktor nie wymaga żadnego argumentu ani nie zwraca żadnej wartości.
  • Jest wywoływana automatycznie, gdy obiekt wykracza poza zakres.
  • Destruktor zwalnia przestrzeń pamięci zajmowaną przez obiekty utworzone przez konstruktora.
  • W destruktorze obiekty są niszczone w odwrotnej kolejności do tworzenia obiektu.

Należy tutaj zauważyć, że jeśli obiekt jest tworzony przy użyciu polecenia new lub konstruktor używa polecenia new do alokacji pamięci znajdującej się w pamięci sterty lub w wolnej pamięci, destruktor powinien użyć metody usuwania w celu zwolnienia pamięci.

Składnia

Składnia definiowania destruktora w klasie:

~ () { // some instructions }>

Składnia definiowania destruktora poza klasą:

 :: ~() { // some instructions }>

Przykład 1

Poniższy kod demonstruje automatyczne wykonywanie konstruktorów i destruktorów odpowiednio podczas tworzenia i niszczenia obiektów.

C++

piękna Zinta




// C++ program to demonstrate the execution of constructor> // and destructor> #include> using> namespace> std;> class> Test {> public>:> >// User-Defined Constructor> >Test() { cout <<>' Constructor executed'>; }> >// User-Defined Destructor> >~Test() { cout <<>' Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }>

>

>

Wyjście

 Constructor executed Destructor executed>

Przykład 2

Poniższy kod demonstruje automatyczne wykonywanie konstruktorów i destruktorów za każdym razem, gdy odpowiednio tworzonych i niszczonych jest wiele obiektów.

C++




// C++ program to demonstrate the execution of constructor> // and destructor when multiple objects are created> #include> using> namespace> std;> class> Test {> public>:> >// User-Defined Constructor> >Test() { cout <<>' Constructor executed'>; }> >// User-Defined Destructor> >~Test() { cout <<>' Destructor executed'>; }> };> main()> {> >// Create multiple objects of the Test class> >Test t, t1, t2, t3;> >return> 0;> }>

>

>

Wyjście

 Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed>

Przykład 3

Poniższy program w C++ pokazuje, ile razy wywoływane są konstruktory i destruktory.

C++




// C++ program to demonstrate the number of times> // constructor and destructors are called> #include> using> namespace> std;> static> int> Count = 0;>//It is static so that every class object has the same value> class> Test {> public>:> >// User-Defined Constructor> >Test()> >{> >// Number of times constructor is called> >Count++;> >cout <<>'No. of Object created: '> << Count> ><< endl;> >}> >// User-Defined Destructor> >~Test()> >{> > >cout <<>'No. of Object destroyed: '> << Count>//It will print count in> ><< endl;>//decending order> >Count--;> >// Number of times destructor is called> >}> };> // driver code> int> main()> {> >Test t, t1, t2, t3;> >return> 0;> }>

>

>

Wyjście

No. of Object created: 1 No. of Object created: 2 No. of Object created: 3 No. of Object created: 4 No. of Object destroyed: 4 No. of Object destroyed: 3 No. of Object destroyed: 2 No. of Object destroyed: 1>

Notatka: Obiekty są niszczone w kolejności odwrotnej do ich powstania. W tym przypadku t3 jest niszczone jako pierwsze, a t jako ostatnie.

Właściwości destruktora

Oto główne właściwości Destructora:

  • Funkcja destruktora jest wywoływana automatycznie, gdy obiekty zostaną zniszczone.
  • Nie można go zadeklarować jako static ani const.
  • Destruktor nie ma argumentów.
  • Nie ma typu zwrotu ani nawet void.
  • Obiekt klasy z Destruktorem nie może zostać członkiem unii.
  • Destruktor należy zadeklarować w publicznej części klasy.
  • Programista nie może uzyskać dostępu do adresu destruktora.

Kiedy wywoływany jest destruktor?

Funkcja destruktora jest wywoływana automatycznie, gdy obiekt wykracza poza zakres:

  1. funkcja się kończy
  2. program się kończy
  3. kończy się blok zawierający zmienne lokalne
  4. wywoływany jest operator usuwania

Notatka: niszczyciel można również wywołać jawnie dla obiektu.

Jak jawnie wywołać destruktory?

Destruktory możemy wywołać jawnie za pomocą następującej instrukcji:

object_name.~class_name()>

Czym destruktory różnią się od normalnych funkcji składowych?

  • Destruktory mają taką samą nazwę jak klasa poprzedzona tyldą (~)
  • Destruktory nie przyjmują żadnych argumentów i niczego nie zwracają

C++




jak przekonwertować ciąg na int w Javie

#include> using> namespace> std;> class> String {> private>:> >char>* s;> >int> size;> public>:> >String(>char>*);>// constructor> >~String();>// destructor> };> String::String(>char>* c)> {> >size =>strlen>(c);> >s =>new> char>[size + 1];> >strcpy>(s, c);> }> String::~String() {>delete>[] s; }> int> main()> {> >String str =>'Hello, World!'>;> >String myString(str);> >cout <<>'String: '> << myString.s << endl;> >return> 0;> }>

>

>

Czy w klasie może znajdować się więcej niż jeden destruktor?

Nie, w klasie może znajdować się tylko jeden destruktor z nazwą klasy poprzedzoną ~, bez parametrów i bez typu zwracanego.

Kiedy musimy napisać destruktor zdefiniowany przez użytkownika?

Jeśli nie napiszemy w klasie własnego destruktora, kompilator utworzy za nas destruktor domyślny. Domyślny destruktor działa dobrze, chyba że mamy dynamicznie przydzieloną pamięć lub wskaźnik w klasie. Gdy klasa zawiera wskaźnik do pamięci przydzielonej w klasie, powinniśmy napisać destruktor, który zwolni pamięć, zanim instancja klasy zostanie zniszczona. Należy to zrobić, aby uniknąć wycieków pamięci.

Czy destruktor może być wirtualny?

Tak. W rzeczywistości zawsze dobrym pomysłem jest utworzenie wirtualnych destruktorów w klasie bazowej, gdy mamy funkcję wirtualną. Więcej szczegółów znajdziesz w wirtualnym destruktorze.

Możesz wziąć udział w quizie na temat destruktorów.

Powiązane artykuły