- •Технологии программирования Структурное и объектно-ориентированное программирование
- •Классы и потоки ввода-вывода
- •Стандартный ввод-вывод
- •Ввод для встроенных типов
- •Вывод для встроенных типов
- •Управление вводом-выводом
- •Классы, инкапсуляция, объекты
- •Управление доступом к элементам класса
- •Список элементов класса
- •Определение методов класса
- •Вызов метода и доступ к элементам класса
- •Конструкторы и деструкторы
- •Инициализация конструкторов класса
- •Полиморфизм. Перегрузка функций
- •Перегрузка конструкторов
- •Функция с параметрами по умолчанию
- •Конструктор по умолчанию
- •Конструктор копирования
- •Обобщение перегрузки конструкторов и инициализации объектов
- •Полиморфизм. Перегрузка операций
- •Динамическое выделение памяти
- •Динамическое выделение памяти в конструкторе
- •Копирование динамических объектов
- •Наследование и контроль доступа Базовые и производные классы
- •Использование конструкторов с параметрами при наследовании
- •Множественное наследование
- •Полиморфизм. Виртуальные функции
Динамическое выделение памяти в конструкторе
Можно выделять динамически память под объекты любого типа, определенного к этому моменту. Под простые переменные динамически выделять память невыгодно, так как она расходуется не только под переменные, но и под информацию о выделении памяти. Целесообразно выделять память под большие объекты, например, массивы неизвестного заранее размера. Это можно делать в конструкторе класса, элементом которого является массив. При этом динамическое выделение памяти можно использовать и для объекта.
Выше (пример 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 разрушена
