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 удаляется дважды. Использование таких функций не может закончиться ничем хорошим.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.