Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы(С++).doc
Скачиваний:
6
Добавлен:
17.11.2019
Размер:
385.54 Кб
Скачать

Указатели на объекты

Создание и удаление объектов в динамической памяти

Выделяют два основных отличия между статическими и динамическими объектами.

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

  • Выделение и освобождение памяти под статические объекты производится компилятором автоматически. Выделение и освобождение памяти под динамические объекты целиком и полностью возлагается на программиста. Для манипуляции динамически выделяемой под объекты памятью служат операторы new и delete.

Если объявлен некоторый объект, то для работы с ним можно создать указатель, хранящий адрес объекта. Синтаксис резервирования места под объект в динамической памяти:

имя_класса *указатель = new тип_объекта;

Здесь имя_класса – имя класса, адрес экземпляра которого, размещенного в динамической памяти будет хранить объявляемый указатель, а тип_объекта – спецификатор типа объекта (экземпляра класса), для размещения которого выделяется память.

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

Сar *ptrCar = new Car;

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

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

Рассмотрим пример:

#include <iostream>

using namespace std;

//описание класса

class Car

{

public:

Car();

~Car();

private:

unsigned int itsYear;

};

Car::Car()

{

itsYear=5;

cout<< "Constructor called\n";

}

Car::~Car ( )

{

cout<< "Destructor called\n";

}

int main( )

{

cout<<"Static memory. Creation object…"<<endl;

Car myZaparozec; // в стеке создается объект myZaparozec

cout<<"Dynamic memory. Creation object…"<<endl;

Car *ptrCar=new Car; // в динамической памяти

//резервируется место под объект класса Car, адрес

// участка сохраняется в указателе ptrCar

cout<<"Delete object..."<<endl;

delete ptrCar; //освобождение указателя и вызов деструктора

cout<<"Function main() exit..."<<endl;

return 0;

}

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

Static memory. Creation object…

Constructor called

Dynamic memory…Creation object

Constructor called

Delete object...

Destructor called

Function main() exit...

Destructor called

Доступ к членам объекта в динамической памяти

Для доступа к переменным-членам и функциям объекта, созданного в динамической памяти, необходимо использовать оператор косвенного доступа – стрелка (- >).

#include <iostream>

class myclass

{

int a;

public:

myclass ( ) {a = 10;}

~myclass();

int Show ( );

};

int myclass:: Show ( )

{

return a;

}

int main ()

{

myclass *Object=new myclass; // объект в динамической памяти

std::cout<<"\nBy way of Pointer..."<<Object->Show ()<<"\n";

return 0;

}

Результат:

By way of Pointer...10