В дополнение к конструктору, который автоматически вызывается при создании объекта класса, как упоминалось в предыдущем разделе, функция также автоматически вызывается при уничтожении объекта. Она также имеет то же имя, что и имя класса, и не имеет возвращаемого значения. Перед именем стоит тильда ~ . Использование Чтобы отличить конструктор, его функция в основном используется для очистки последствий после освобождения объекта. Это деструктор .
Как и в случае с конструктором и именем класса, возвращаемое значение отсутствует. Если пользователь его не определит, система автоматически сгенерирует пустой деструктор. После определения пользователем он автоматически вызывается при уничтожении объекта.
В отличие от конструкторов, хотя они оба являются открытыми типами. Конструкция может быть перегружена и имеет несколько братьев, но деструктор не может быть перегружен, но это может быть виртуальная функция, а класс может иметь только один деструктор.
Далее мы возьмем класс Student в качестве примера и продолжим добавлять деструктор. В то же время мы добавляем информацию о текущем классе как в конструктор, так и в деструктор, чтобы определить, какой класс создается и уничтожается. Пожалуйста, внимательно прочитайте код. :
#include<iostream>#include<Cstring>usingnamespacestd;classStudent{private:intnum;//номер студента charname[100];//name intscore;//score public:Student(intn,char*str,ints);~Student ();intprint();intSet(intn,char*str,ints);};Student::Student(intn,char*str,ints){num=n;strcpy(name,str);score=s;cout <<num<<<<name<<<<score<<;cout<<Constructor<<endl;}Student::~Student(){cout<<num<<<<name<<<<score<<; cout<<destructor<<endl;}intStudent::print(){cout<<num<<<<name<<<<score<<endl;return0;}intStudent::Set(intn,char*str,ints) {num=n;strcpy(name,str);score=s;}intmain(){StudentA(100,dot,11);StudentB(101,cpp,12);return0;}
Пожалуйста, внимательно разберитесь с конструктором и деструктором в приведенном выше коде и обратите внимание, что два объекта A и B определены в основной функции, и протестируйте их на своем компьютере. Вы можете видеть, что эффект от работы следующий:
Как видите, порядок вызова конструкторов и порядок вызова деструкторов объектов A и B совершенно противоположный! Причина в том, что объекты A и B являются локальными объектами и также хранятся в области стека. Они также следуют порядку «первым пришел — последним вышел».
Пожалуйста, обязательно протестируйте и проверьте результаты лично!