- •Введение в понятие класса
- •Void queue::init(void)
- •Перегруженные функции
- •Int sqr_it(int I); // Прототипы
- •Перегрузка операций.
- •Наследование
- •Конструкторы и деструкторы
- •Int sloc,rloc;
- •Void qput(int); // Прототип
- •Int qget(void); // Прототип
- •Конструктор с параметрами
- •Конструктор копирования
- •Void input();
- •Void output();
- •Void ThreeAngle::input()
- •Void ThreeAngle::output()
- •Void main(void)
- •Дружественные функции
- •Замечание
- •Дружественные классы
- •Аргументы функций, задаваемые по умолчанию
- •Void main(void)
- •Void stringxy(char *str, int X, int y)
- •Структуры и классы
- •Объединения и классы
- •Void main()
- •Наследование классов
- •Конструкторы с параметрами при наследовании
- •Множественное наследование
- •Перегрузка функций и операций
- •Ключевое слово this
- •Перегрузка операций ввода/вывода. Инсерторы и экстракторы
- •Void main(void)
- •Vector a(1,2,3),b(4,5,6);
- •Void main(void)
- •Vector a(1,2,3),b(4,5,6);
- •Void main(void)
- •Vector a(1,2,3);
- •Дружественные функции-операции
- •Void main(void)
- •Void swap1(int *I, int *j)
- •Void swap(int a, int b)
- •Void swap1(int *I, int *j)
- •Void swap2(int &a, int &b)
- •Использование ссылочных переменных для перегрузки унарных операций
- •Перегрузка операции индексации [ ]
- •Использование виртуальных функций
- •Указатели на производные типы
- •Виртуальные функции
- •Замечания к использованию виртуальных функций
- •Пример использования виртуальных функций
- •Чистые виртуальные функции и абстрактные типы
- •Производные классы и их конструкторы и деструкторы
- •Void main()
- •Конструкторы и деструкторы при множественном наследовании
- •Void main()
- •Виртуальные базовые классы.
- •Операции динамического выделения памяти new и delete
- •Void main(void)
- •Void main(void)
- •Виртуальные деструкторы
- •Void main(void)
- •Void main(void)
- •Шаблоны классов и функций
- •Шаблоны функций
- •Void main(void)
- •Void main(void)
- •Шаблоны классов
- •Int sloc, rloc;
- •Void qput(t I);
- •Void main(void)
- •Статические члены класса
- •Локальные классы
- •Void f(void);
- •Void main(void)
- •Void f(void)
- •Вложенные классы
- •Void main(void)
Операции динамического выделения памяти new и delete
В С для динамического выделения и освобождения памяти используются функции malloc() и free(), а для определения размера необходимой памяти – операция sizeof. В C++ используются две операции – new и delete. Их форма использования:
pointer_var = new var_type;
delete pointer_var;
pointer_var – указатель - типа var_type;
Операция new выделяет соответствующее место для переменной в соответствующей области памяти и возвращает адрес выделенного места. Неуспешная попытка – возвращение нулевого указателя NULL.
Операция delete освобождает соответствующую память, на которую указывает pointer_var.
Удобство операции new состоит в том, что операция сама определяет размер переменной var_type автоматически и возвращает указатель, уже преобразованный к этому типу.
Пример выделения памяти под массив
pointer_var = new var_type[SIZE];
delete [SIZE] pointer_var; // или delete pointer_var;
Пример использования этих операций:
#include <iostream.h>
Void main(void)
{
int *p;
p=new int; // выделение памяти под целое
if(!p) {
cout<<”\n Недостаточно памяти!\n”;
return 1;
}
*p=20;
cout<<p<<endl;
delete p; // освобождение памяти
}
Пример работы с динамически выделенной памятью под массив:
#include <iostream.h>
Void main(void)
{
int *p;
unsigned int size;
cout<<”\n Введите размер массива:”;
cin>>size;
p=new int[size];
if(!p) {
cout<<”\n Недостаточно памяти!\n”;
return 1;
}
for(int i=0; i<size; i++)
p[i]=i*i; // использование *p++=i** меняет значение указателя
// получаем некорректность при освобождении памяти
int *q=p;
for( i=0; i<size; i++)
cout<<*q++<<” “; // корректно
cout<<endl;
delete p;
}
Динамическое выделение памяти целесообразно для выделения памяти под большие объекты, массивы, особенно под массивы неизвестного заранее размера. Часто динамическое выделение памяти используется в конструкторах класса, элементом которого является массив (массивы). При этом для выделения памяти под объект также может использоваться динамическое выделение памяти.
Пример класса queue с динамическим выделением памяти под массив.
#include <iostream.h>
class queue
{
int *q;
int sloc,rloc;
unsigned size;
public:
queue(int sz); // Конструктор
~queue(void); // Деструктор
void qput(int i);
int qget(void);
};
queue::queue(int sz)
{
size=sz;
if(!(q=new int[size]))
{
cout<,”\n Недостаточно памяти!\n”; return 1;
}
queue::~queue(void)
{
delete q;
cout<<”\n Очередь разрушена!”;
}
void queue::qput(int i)
{
if(sloc==size)
{
cout<<”\n Очередь полна!\n”;
return;
}
q[sloc++]=i;
}
int queue::qget(void)
{
if(sloc==rloc)
{
cout<<”\n Очередь пуста!\n”;
return 0;
}
return q[rloc++];
}
void main()
{
queue a(5), b(100); // объявили два объекта
a.qput(10);
b.qput(19);
a.qput(20);
b.qput(1);
cout<<a.qget()<<” “;
cout<<a.qget()<<” “;
cout<<b.qget()<<” “;
cout<<b.qget()<<” “;
queue *pq;
int s=20;
pq = new queue (s); // динамическое создание объекта
// именно сейчас вызывается конструктор queue
if (!pq)
{
cout<<”\n недостаточно памяти \n”;
return 0;
}
else
cout<<”\n Объект класса queue создан \n”;
for(int i=0; i<s;i++)
pq->qput(2*i+1); // заполнение очереди
for(i=0;i<s;i++)
cout<<pq->qget()<<” “;
cout<<endl;
delete pg;
}
При программировании на С++ создание объекта динамически и конструктор динамически выделяет память типичная ситуация.