- •Пространство имен.
- •Представление целых чисел
- •Определение переменных
- •Особенности использования некоторых типов данных: переполнение регистров переменных
- •Базовые конструкции структурного программирования
- •Условный оператор if
- •Ветвление процесса выполнения программ
- •Тема: Указатели и ссылки
- •Адреса переменных. Оператор взятия адреса
- •Указатели
- •Динамически распределяемая память
- •Указатели на объекты
- •Выделяют два основных отличия между статическими и динамическими объектами.
- •Перегрузка функций
- •Значения параметров функции, используемые по умолчанию
- •Определение массива
- •“Sdjdkjdhkfsdjhvm,c,bnmsierhoerhsdklfhbnasmbf”; //правильно Пустая строка записывается “ ” и имеет тип const char[1]. Использование датчика случайных чисел для формирования массива
- •Конструкторы и деструкторы
Указатели на объекты
Создание и удаление объектов в динамической памяти
Выделяют два основных отличия между статическими и динамическими объектами.
Объекты, созданные в статической памяти (статические объекты) обозначаются именованными переменными, и действия над этими объектами производятся напрямую, с использованием их имен. Объекты, созданные в динамической памяти (динамические объекты) не имеют собственных имен, и действия над ними производятся косвенно, с помощью указателей.
Выделение и освобождение памяти под статические объекты производится компилятором автоматически. Выделение и освобождение памяти под динамические объекты целиком и полностью возлагается на программиста. Для манипуляции динамически выделяемой под объекты памятью служат операторы 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