Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



Если с динамическим массивом работаем в классе, то указатель на динамический массив и его размерность включаем в класс в качестве обязательных полей. Резервирование памяти и инициализация указателя на массив с помощью операции 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 ().





Дата публикования: 2015-02-18; Прочитано: 880 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...