Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга_2013_2_часть+.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
816.64 Кб
Скачать

6.2. Работа с динамическим массивом в классе. Деструктор

Если с динамическим массивом работаем в классе, то указатель на динамический массив и его размерность включаем в класс в качестве обязательных полей. Резервирование памяти и инициализация указателя на массив с помощью операции new выполняется, как правило, в конструкторе, а освобождение этой памяти — в деструкторе.

Пример 4. Создать класс для работы с одномерным динамическим массивом, предусмотрев конструктор и деструктор.

const Nmax=20; /* Наибольшая размерность массива, которая используется в конструкторе для контроля передаваемой в класс размерности. */

class DinArr {

int n; /* Реальная размерность массива в виде переменной*/

float *DA; /*Объявляем указатель на динамический массив. */

/* Метод для перестановки двух чисел. Можно использовать только внутри класса, так как по умолчанию атрибут доступа private. В качестве формальных параметров используем указатели на вещественные числа. */

void Change(float *x, float* y) { float t=*x; *x=*y; *y=t; };

public: // Конструктор

DinArr(int size) { if (size<1 || size>Nmax) n=Nmax / 2; else n=size;

DA=new float [n]; }

// Метод для ввода массива.

void MyDef() { for(int i=0; i<n; i++) cin>>DA[i]; }

// Метод для вывода массива.

void Show() { cout<<endl; for(int i=0; i<n; i++) printf("%5.2f ", DA[i]); }

/* Булевская функция (метод), возвращающая true или false в зависимости от того, является ли массив “симметричным” относительно “центра”. */

bool Simm() { for (int i=0;i<n/2; i++) if (DA[i]-DA[n-1-i]) return false;

return true; }

/* Метод, который “переворачивает” массив, т. е. меняет местами первый элемент с последним, второй с предпоследним и т. д. до середины массива */

void Rev() {

for (int i=0;i<n/2; i++)

Change(&DA[i], &DA[n-1-i]); }

~DinArr() // Дeструктор

{ cout<<"\nThe destructor deletes array\n" ; getch(); delete []DA;

} // The end of destructor

} ; // The end of class

int main()

{ /* Создаём объект и одновременно вызываем конструктор. Фактический параметр для него (размерность массива) вводим */

unsigned MyN; cout<<"size="; cin>>MyN; DinArr ObjArr(MyN);

/* Вызываем методы класса */

ObjArr.MyDef(); ObjArr.Show();

/* Если массив симметричный, выводим "Yes !", в противном случае “переворачиваем” массив и выводим изменённый массив. */

if (ObjArr.Simm()) cout<<"Yes !";

else { ObjArr.Rev(); ObjArr.Show(); }

getch(); return 0; }

Во время выполнения, а не компиляции программы при объявлении объекта вызывается конструктор. С его помощью определяем размерность массива n с элементарным контролем. С помощью операции new резервируем память для n элементов динамичского массива и адрес начала этой выделенной области памяти присваиваем переменной-указателю DA. Кроме ввода размерность можно задать случайным образом DinArr ObjArr (random(Nmax)); или константой DinArr ObjArr(6);

Как и конструктор, деструктор не имеет типа, а его имя совпадает с именем класса, перед которым записывается символ “~” (тильда). Чтобы убедиться, что деструктор выполнялся, желательно выводить соответствующее сообщение. Кроме этого, освободили память, выделенную для динамического массива. Вызывается деструктор автоматически, когда завершается выполнение функции main().