«

»

C++. ООП. Функция-деструктор и массив экземпляров

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;
}

 

Результат работы программы:

Как и любой другой массив, массив экземпляров класса может быть динамическим. Для работы с динамическими массивами экземпляров класса необходимо:

  1. Описать указатель на класс.
  2. Определить количество экземпляров класса.
  3. С помощью оператора 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");
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вы можете использовать эти теги HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Проверка на человечность *