~ имя класса () { операторы тела деструктора};
1) Между тильдой и именем класса нет пробелов.
2) У деструктора нет типа результата даже void и нет параметров даже типа void.
3) Деструктор выполняется неявно, автоматически, как только объект уничтожается. Его, как правило, никогда не вызывают, но можно и вызывать явно, если он определен в классе
<имя объекта>. ~ <имя класса> ();
При этом объект будет продолжать существовать, только выполняться те действия, которые записаны в теле деструктора.
Рассмотрим класс Men, несущий в себе данные о возрасте и имени индивидуума.
Пусть в этом классе присутствуют и конструктор и деструктор.
В конструкторе кроме инициализирующих действий имеется еще вывод контрольной строки.
Деструктор пусть также содержит вывод другой контрольной строки.
class Men {
char* name;
int age;
public:
Men(char * n, int a) // встроенный конструктор
{ name = n; age = a;
cout<<name << “ - begin “<<endl;
}
void SetN (char*n) {name =n; } // комп. функция для изменения данного
void SetA (int a) { age = a;} // комп. функция для изменения другого данного
char* GetN () { return name; } // компонентные функции
int GetA { return age; } // возвращающие значения данных
~Men () { cout<< name<< “- end”<<endl;} // деструктор
#include <iostream.h>
#include<conio.h>
void main () {
/* создание экземпляра класса по имени:
конструктор автоматически вызывается при создании объекта, и т.к. наш конструктор требует двух параметров, то в строке создания объекта (или в строке вызова конструктора) необходимо указать оба параметра, которые и инициируют создаваемый объект m1 */
Men m1 (“Петров”, 34);
/* создается объект,параметры конструктора инициализируют
переменную m1 (объект) */
/* Men m1; - уже не верно!
т.к. в классе нет конструктора без параметров,т.е. в этом
случае нельзя создать неинициализированный объект * /
/* создание экземпляра класса с помощью указателя:
параметры конструктора инициализируют динамически выделенный участок памяти под объект типа Men*/
Men * m2 = new Men (“Рощин ”, 25);
cout<<m1. GetN ()<< “ “ << m1. GetA() << endl;
cout<< m2->GetN() << “ “ << m2-> GetA () << endl;
getch();
}
Результат:
Петров -begin
Рощин - begin
Петров 34
Рощин 25
Петров -end
Итак, конструктор вызывался автоматически дважды при создании объекта по имени и с помощью указателя.
Деструктор вызывался только один раз. Для объекта m2 деструктор не вызывался, т.к. мы выделили память “вручную” и так и не вернули ее системе, т.е. система не фиксирует уничтожение этого объекта при завершении программы.
Если перед getch() вставить строку
delete (m2);
то результат будет:






