Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вариант_№29.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
403.97 Кб
Скачать

Динамическое выделение памяти в конструкторе

Можно выделять динамически память под объекты любого типа, опреде­ленного к этому моменту. Под простые переменные динамически выделять па­мять невыгодно, так как она расходуется не только под переменные, но и под информацию о выделении памяти. Целесообразно выделять память под большие объекты, например, масси­вы неизвестного заранее размера. Это можно делать в конструкторе класса, эле­ментом которого является массив. При этом динамическое выделение памяти можно использовать и для объекта.

Выше (пример 9) была рассмотрена модель очереди фиксированной дли­ны, но более адекватной является модель очереди с переменным размером.

Пример 21.

Рассмотрим работу программы с классом Queue (очередь) с переменной длиной очереди.

#include<iostream.h>

#include<conio.h>

class Queue // класс "очередь"

{ int *q; // указатель очереди

unsigned size; // переменная размера очереди

int head, tail; // начало и конец очереди

public: // прототипы методов класса:

Queue (int sz); // конструктор очереди

~Queue(); // деструктор

void qput(int i); // постановка в очередь

int qget(); // выход из очереди

void show(); // вывод данных очереди

};

// описание методов класса:

Queue :: Queue(int sz) // конструктор инициализации очереди

{ size=sz; // инициализация размера очереди

q=new int [size]; // выделение памяти заданного размера

tail=head=0; // исходное обнуление очереди

for(int i=0; i<sizeq; i++) q[i]=0;

cout<<"Очередь размера " << size <<" инициализирована\n";

}

Queue :: ~Queue () // деструктор очереди

{ delete q;

cout << "Очередь разрушена деструктором явно\n";

}

void Queue :: qput (int i) // метод постановки в очередь

{ if ( tail == size ) // если все места заняты, то сообщение

{ cout << "Очередь полна ";

return;

}

q [ tail++ ] = i; // увеличение очереди

}

int Queue :: qget ( ) // метод выхода из очереди

{ if ( head==tail ) // если достигнут конец очереди, то сообщение

{ cout << "Очередь пуста ";

return 1111; // возврат какого-либо значения

}

int i = q [ head ]; // значение уходящего элемента очереди

q [ head++ ]; // сдвиг начала очереди к концу

return i; // возврат значения элемента очереди

}

void Queue::show() // метод вывода приватных данных очереди

{ cout<<"Значения: head="<<head<<" tail="<<tail<<" Элементы очереди: ";

for (int i=0; i<sizeq; i++) cout<< q [ i ] <<" ";

cout<<"\n";

}

int main() // главная функция

{ clrscr(); // чистка экрана результатов

cout <<"Действия очереди переменного размера:\n";

Queue *pq; // указатель на очередь

int s; // переменная размера очереди

cout <<"\nВведите размер очереди s= ";

cin >> s; // ввод размера очереди

pq = new Queue (s); // динамическое создание очереди

if (! pq) // проверка объема динамической памяти

{ cout << "Недостаточно памяти\n";

return 0; // аварийный выход из программы

}

else cout << "Объект класса Queue создан\n";

for(i=0; i < s; i++) // цикл заполнения очереди данными

pq -> qput (2*i+1);

cout <<"\nОчередь pq: ";

pq -> show(); // вывод значений элементов очереди

cout << "Вывод элементов из очереди pq: ";

for (i=0; i<s; i++) // цикл вывода из очереди

cout << pq -> qget() << " ";

cout << "\n";

pq -> show(); // вывод значений элементов очереди

delete pq; // разрушение очереди явно

cout << "Очередь pq разрушена\n";

getch(); // задержка экрана результатов

return 0; // нормальное окончание программы

}

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

Действия очереди переменного размера:

Введите размер очереди s= 8

Очередь размера 8 инициализирована

Объект класса Queue создан

Очередь pq: Значения: head=0 tail=8 Элементы очереди: 1 3 5 7 9 11 13 15

Вывод элементов из очереди pq: 1 3 5 7 9 11 13 15

Значения: head=8 tail=8 Элементы очереди: 1 3 5 7 9 11 13 15

Очередь разрушена деструктором явно

Очередь pq разрушена

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]