Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Если с динамическим массивом работаем в классе, то указатель на динамический массив и его размерность включаем в класс в качестве обязательных полей. Резервирование памяти и инициализация указателя на массив с помощью операции 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!