C++ позволяет построить функцию деструктор, которая выполняется при уничтожении экземпляра класса, что происходит в следующих случаях:
- при завершении программы или выходе из функции;
- при освобождении памяти, выделенной для экземпляра класса.
Деструктор имеет — имя_класса, не имеет параметров и не может перегружаться. Если деструктор не определен явно, то будет использоваться стандартный деструктор. Допустим у нас имеется класс SLAU, в котором нужно освободить память. Запишем в него деструктор ~SLAU(), который будет делать это и выводить сообщение об уничтожении объекта.
1
2 3 4 5 6 7 8 9 10 |
SLAU::~SLAU()
{ int i; delete []b; delete []x; for (i=0; i<n; i++) delete []a[i]; delete []a; cout<<«Memory is exempt»; } |
Массив экземпляров класса
Так же, как и другие типы, классы могут объединяться в массивы. Для каждого элемента массива будет автоматически вызываться конструктор. Создадим массив экземпляров класса prostr, рассмотренного в прошлых уроках. В нем оставим конструктор без параметров (значение n и k будут вводиться с экрана дисплея). После внесенных изменений у нас должно получиться, подобное тексту ниже.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
#include «stdafx.h»
#include <iostream> #include <math.h> #define PI 3.14159 using namespace std; //описываем класс prostr class prostr { public: prostr(); ~prostr(); double poisk_min(); double poisk_max(); int vivod_result(); int delete_a(); private: int k; int jmin; int imax; int jmax; int imin; int n; double **a; double min; double max; }; void main() { setlocale(LC_ALL,«Rus»); int m; //описан массив из трех экземпляров класса, при этом для //каждого экземпляра класса (x[0], x[1], x[2]) автоматически //будет вызываться конструктор. Деструктор тоже будет //вызываться автоматически для всех экземпляров класса prostr x[3]; //для каждого экземпляра класса вызываем методы //poisk_max(), poisk_min(), vivod_result() for (m=0; m<3; m++) { x[m].poisk_max(); x[m].poisk_min(); x[m].vivod_result(); } system(«pause»); } //конструктор класса prostr::prostr() { int i, j; cout<<» Введите размерность пространства «; cin>>k; cout<<» Введите количество точек «; cin>>n; a=new double*[k]; for(i=0; i<k; i++) a[i]=new double[n]; for(j=0; j<n; j++) { cout<<» Введите координаты «<<j<<» точки «; for(i=0; i<k; i++) cin>>a[i][j]; } } //деструктор класса prostr::~prostr() { int i; for (i=0; i<k; i++) delete []a[i]; delete []a; cout<<» Объект удален! «; } //текст метода poisk_max класса prostr double prostr::poisk_max() { int i, j, l; double s; for (max=0, l=0; l<k; l++) max+=(a[l][0]—a[l][1])*(a[l][0]—a[l][1]); max=pow(max,0.5); imax=0; jmax=1; for(i=0; i<n; i++) for(j=i+1; j<n; j++) { for (s=0, l=0; l<k; l++) s+=(a[l][i]—a[l][j])*(a[l][i]—a[l][j]); s=pow(s,0.5); if (s>max) { max=s; imax=i; jmax=j; } } return 0; } //текст метода poisk_min класса prostr double prostr::poisk_min() { int i, j, l; double s; for (min=0, l=0; l<k; l++) min+=(a[l][0]—a[l][1])*(a[l][0]—a[l][1]); min=pow(min,0.5); imin=0; jmin=1; for(i=0; i<k; i++) for(j=i+1; j<n; j++) { for (s=0, l=0; l<k; l++) s+=(a[l][i]—a[l][j])*(a[l][i]—a[l][j]); s=pow(s,0.5); if (s<min) { min=s; imin=i; jmin=j; } } return 0; } //текст метода vivod_result класса prostr int prostr::vivod_result() { int i, j; for (i=0; i<k; cout<<endl, i++) for (j=0; j<n; j++) cout<<a[i][j]<<«\t«; cout<<«max=»<<max<<«\t номера»<<imax<<» «<<jmax<<endl; cout<<«min=»<<min<<«\t номера»<<imin<<» «<<jmin<<endl; return 0; } |
Результат работы программы:
Как и любой другой массив, массив экземпляров класса может быть динамическим. Для работы с динамическими массивами экземпляров класса необходимо:
- Описать указатель на класс.
- Определить количество экземпляров класса.
- С помощью оператора new создать динамический массив экземпляров класса.
Перепишем функцию main для работы с динамическим массивом экземпляров prostr.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void main()
{ setlocale(LC_ALL,«Rus»); int m, g; //описываем указатель на класс prostr prostr *x; //определяем количество элементов в динамическом массиве cout<<«g=»; cin>>g; //создаем динамический массив из g экземпляров класса prostr x=new prostr[g]; for (m=0; m<3; m++) { x[m].poisk_max(); x[m].poisk_min(); x[m].vivod_result(); } system(«pause»); } |