Zalecane, 2019

Wybór Redakcji

Różnica między konstruktorem a niszczycielem

Czasami wymagane jest zainicjowanie części obiektu, zanim będzie można go wykorzystać. Na przykład, operujemy na stosie, zanim wykonamy jakąkolwiek akcję, górna część stosu musi zawsze być ustawiona na zero. Ta funkcja automatycznej inicjalizacji odbywa się za pomocą "Konstruktora". Prawdopodobnie, jeśli obiekt musi wykonać jakiś kod, zanim zostanie zniszczony. Na przykład, jeśli obiekt musi zamknąć plik, który został otwarty, przed jego zniszczeniem. Można go wykonać za pomocą "Destruktora".

Omówmy niektóre podstawowe różnice między konstruktorem i destruktorem za pomocą tabeli porównawczej

Wykres porównania:

Podstawa do porównaniaKonstruktorBurzyciel
Cel, powód
Przydziela pamięć do obiektu.Zwolnia pamięć obiektu.
Deklaracjaclass_name (ewentualne argumenty) {};~ nazwa_klasy (bez argumentów) {};
ArgumentyConstructor przyjmuje argumentDestruktor nie przyjmuje żadnych argumentów.
PowołanieKonstruktor jest wywoływany automatycznie podczas tworzenia obiektu.Destruktor jest wywoływany automatycznie, gdy blok zostaje zakończony lub program zostaje zakończony.
PracującyKonstruktor pozwala obiektowi zainicjować część jego wartości, zanim zostanie użyty.Destruktor pozwala obiektowi na wykonanie kodu w momencie jego niszczenia.
Porządek wykonania
Konstruktorzy są wywoływani w kolejnej kolejności.
Destruktor wywoływany jest w odwrotnej kolejności od konstruktora.
W liczbachW klasie może być wiele konstruktorów.Ale w klasie zawsze istnieje jeden destruktor.
Skopiuj KonstruktoraKopiuj konstruktor umożliwia konstruktorowi zadeklarowanie i zainicjowanie obiektu z innego obiektu.Brak takiej koncepcji.
PrzeciążenieKonstruktory mogą być przeciążone.Destructor nie może być przeciążony.

Definicja konstruktora:

Konstruktor jest podstawową funkcją klasy, która inicjuje obiekt i przydziela do niego pamięć. Konstruktory można łatwo zidentyfikować, ponieważ są zadeklarowane i zdefiniowane pod tą samą nazwą, co nazwa klasy. Konstruktor nie ma żadnego typu zwracanego; więc nic nie zwracają, nawet "nieważne". Konstruktor jest zawsze zdefiniowany w publicznej części klasy.

W klasie może być wiele konstruktorów; można je rozróżnić na podstawie liczby i rodzaju przekazywanych argumentów. Jeśli istnieje wiele konstruktorów w klasie; niejawny konstruktor (konstruktor nie powodujący niczego) musi być zdefiniowany wraz z nimi; nie robi nic innego, tylko satysfakcjonuje kompilator.

Konstruktory można również zdefiniować za pomocą domyślnych argumentów. Natomiast inicjują obiekt "dynamicznie". Konstruktory nie mogą być dziedziczone, ani wirtualne, ale mogą być przeciążone. Nie można ich skierować na ich adres.

Implementacja konstruktora:

 klasa Const {int a, b; public: Const () {// konstruktor bez parametru a = 0; b = 0; } Const (int c, int d) {// konstruktor z parametrem a = c; c = d; }}; int main () {Const C1; C2 (10, 20); // ta instrukcja wywołuje konstruktor} 

Gdy tworzony jest C1, konstruktor bez parametru zostaje wykonany, ponieważ C1 nie przekazuje żadnego parametru. Natomiast gdy tworzone jest C2, konstruktor z parametrem zostaje wykonany, ponieważ przekazuje dwie liczby całkowite do konstruktora.

Definicja Destructor:

Destruktor jest również członkiem funkcji klasy, która zwalnia pamięć przydzieloną do obiektu. Jest zdefiniowany pod tą samą nazwą, co nazwa klasy, poprzedzony znakiem tyldy (~). Destruktory są zawsze wywoływane w odwrotnej kolejności od konstruktorów.

Zawsze istnieje jeden destruktor w klasie, ponieważ nie przyjmuje on żadnych argumentów. Lokalne obiekty są niszczone, gdy tylko kontrola wykonania blokuje blok; z drugiej strony obiekty globalne są niszczone po zakończeniu całego programu. Destirator jest niejawnie wywoływany przez kompilator. Jeśli klasy są dziedziczone, a klasa jest wyprowadzana z klasy nadrzędnej, a klasa potomna i klasa nadrzędna mają destruktory; następnie destruktor klasy pochodnej jest nazywany pierwszym, po którym następuje destruktor klasy nadrzędnej.

Implementacja destruktora:

 klasa Const {int a, b; public: Const (int c, int d) {// konstruktor z parametrem. a = c; c = d; cout << "wartość a i b to" < 

Gdy tworzony jest obiekt C1, wywoływany jest konstruktor z dwoma parametrami typu całkowitego, a element członkowski "a, b" zostaje zainicjowany i drukowana jest wartość "a, b". Następnie wywołaj destruktor i wypisz komunikat "obiekt C1 zostanie zniszczony".

Kluczowa różnica między konstruktorami i destruktorami

  1. Głównym celem konstruktora jest przydzielenie pamięci do obiektów podczas ich tworzenia, podczas gdy głównym celem destruktora jest zwolnienie pamięci obiektu po jego zniszczeniu.
  2. Konstruktor może akceptować argumenty, ponieważ argumenty mogą być używane do inicjowania elementów danych klasy. Destruktor nie przyjmuje żadnych argumentów, ponieważ jego jedynym zadaniem jest zwolnienie pamięci obiektu.
  3. Konstruktor jest wywoływany podczas tworzenia obiektu. Z drugiej strony, destruktor jest wywoływany, gdy program jest zakończony lub program wychodzi z bloku, w którym tworzony jest obiekt.
  4. Konstruktor jest zwykle używany do inicjowania elementów danych klasy, podczas gdy destruktor służy do tego, aby obiekt wykonał jakąś akcję zanim zostanie zniszczony.
  5. Konstruktory są wykonywane w kolejnej kolejności, co oznacza, że ​​jeśli istnieje klasa pochodna, która dziedziczy klasę podstawową i tworzony jest obiekt klasy pochodnej, wówczas wywoła najpierw konstruktor klasy bazowej, a następnie konstruktora klasy pochodnej. Z drugiej strony, destruktor klasy pochodnej jest nazywany pierwszym, a następnie klasą podstawową oznacza, że ​​destruktor jest wykonywany w odwrotnej kolejności od konstruktora.
  6. W klasie może istnieć wiele konstruktorów, które są identyfikowane za pomocą przekazywanych argumentów liczbowych. W klasie jest tylko jeden destruktor.
  7. Istnieje pojęcie konstruktora kopiowania, które pozwala na zainicjowanie obiektu z innego obiektu, podczas gdy destruktor nie ma takiej koncepcji.
  8. Konstruktory mogą być przeciążone, aby wykonać inną akcję pod nazwą tego samego konstruktora, podczas gdy destruktory nie mogą być przeciążone.

Wniosek:

Oprócz podobieństwa, ten konstruktor i destruktor są specjalnymi składowymi funkcji klasy i mają tę samą nazwę, podstawową różnicą między nimi jest, "konstruktor" jest wywoływany w czasie przydzielania pamięci, a "destruktor" jest wywoływany czas deallokacji pamięci przedmiotów. Zarówno konstruktor, jak i destruktor są niejawnie wywoływane przez kompilator, mimo że nie są zdefiniowane w klasie.

Top