Теоретические сведения для студентов специальностей «Экономика и организация производства», страница 16

2. Отсутствует необходимость в преобразовании типов, поскольку автоматически возвращается указатель на нужный элемент.

3. Допускается инициализация выделенного блока памяти.

4. Возможна перегрузка операторов new и delete относительно заданного класса.

И наиболее важное!

5. Они гарантируют вызов конструкторов и деструкторов.

Пример:

          Circle * Acircle=new Circle(120,80,50);

Указателю Acircle на тип Circle присваивается адрес блока памяти, достаточный для размещения одного объекта типа Circle.

Для размещения массива используется форма:

mas=new int[100];

Объекты, распределяемые new, за исключением массивов, могут инициализироваться выражением в круглых скобках. При создании многомерных массивов с помощью new следует указывать все размерности, т.е.:

          mas_prt=new int [3] [10] [12];

Для иллюстрации сказанного воспользуемся введенными ранее определениями классов Location и Point. Т.е. предположим, что определение данных класса Location - содержит информацию о координатах точки X и Y , а класс Point, который является производным от класса Location, наследует все то, что имеет класс Location, и добавляет специфическую для вывода точки информацию. Если представить, что определения классов Location и Point содержатся в файле Point.h, то создать динамический объект можно, выполнив следующие действия.

Пример:

          #include <iostream.h>

          #include <graphics.h>

          #include <conio.h>

          #include "Point.h"

          int main (void)

{ Point * APoint=new Point(50,100);

//вызов конструктора и создание динамического объекта

//с размещением его адреса в APoint

          int gd=DETECT,gm;

          initgraph(&gd,&gm,"");             //инициализация графического режима

          APoint -> Show();            //метод класса Point для вывода точки

          cout <<"Вывод точки с координатами (50,100).\

 Нажми любую клавишу для продолжения";    

//символ обратный слеш "\" использован для операции склеивания текстовой

// строки в программе

          getch();

          delete APoint;                           //явное удаление объекта

          closegraph();                            //закрыть графическую систему

          return(0); }

Пример демонстрирует создание нового динамического объекта, его инициализацию и организацию вывода точки при помощи метода Show класса Point.

Для статических и автоматических объектов память распределяется компилятором. Для статических объектов конструктор вызывается перед main , а деструктор – после main.

В случае автоматических объектов конструктор вызывается при выполнении определения объекта, а деструктор – по окончании области действий, т.е. при завершении блока, включающего определение объекта. При этом освобождается занимаемая объектом память. Выполняются либо конструкторы и деструкторы, определенные программистом, либо неявные, вызываемые компилятором по умолчанию.

Создавая динамические объекты с помощью new, программист полностью берет на себя ответственность за его последующее уничтожение, т.к. С++ не может знать, когда объект больше не нужен. Уничтожение осуществляет функция delete. При выполнении команды delete вызывается соответствующий деструктор. Оператор delete можно применять только к указателям, инициализированным при помощи оператора new, или к указателю NULL. Для массивов их в операторе delete необходимо задавать явно.

Еще раз отметим, что С++ не гарантирует выполнение деструктора для объекта, созданного при помощи оператора new.

Например:

          void main (void)

          { table * p=new table(100);

          table * q=new table(200);

          delete p;

delete p;}

В данной функции объект с адресом в q не удаляется из памяти, а объект p удаляется дважды. Использование таких функций не может закончиться ничем хорошим.