-
Notifications
You must be signed in to change notification settings - Fork 6
Создание и уничтожение объектов
Конструкторы отрабатываются в порядке появления в коде объектов.
У каждого объекта существует жизненный цикл. В начале этого цикла (при создании объекта через classname object;
илиobject = new classname
) вызывается конструктор. Деструктор всегда вызывается неявно, при удалении объекта через delete object;
также деструкция происходит при завершении выполнения функции (или при выходе из области видимости), в порядке, обратном созданию объектов – но только «явно» заданных объектов, не через *a = new
.
Локальные статические объекты – конструктор вызывается при первом определении объекта, деструктор вызывается после выполнения функции main но до вызова деструкторов внешних и внешних статических переменных.
Возврат объекта – объект уничтожается когда «необходимость в объекте отпадает». Зависит полностью от компилятора.
Метод класса – static
, не передаётся указатель this
на объект. Конструктор специальный метод – создаёт объект, не возвращает значения; имя совпадает с именем класса, могут принимать параметры. В ЛЮБОМ классе автоматически создаются два конструктора – конструктор по-умолчанию (не принимающий параметра) и конструктор копирования (вызывается при передаче и возврате по значению). Однако если в классе описан хотя бы один не стандартный конструктор, то конструктор-по-умолчанию не создаётся. Аналогично, можно явно задавать конструктор копирования, в случае если под объект так или иначе выделяются ресурсы. Деструктор также необходимо объявлять явно.
Если не нужна возможность передачи\возврата по значению (чтобы не создавались копии), то конструктор необходимо объявить приватным.
Конструктор не может быть константным, volatile
, virtual
, статичным. Не наследуется.
Проблема преобразования типов – не даёт нормально обработать объект при преобразовании его из одного типа в другой. Может возникнуть ситуация, что при создании объекта возникнет ошибка, и будет неясно создан объект или нет. Чтобы не гадать о существовании объекта, используют оператор explicit
– он запрещает преобразование типов и неявный вызов конструктора.
class A: /*<список баз>*/
{
private:
int a;
const int cb;
B obj;
public:
A(int param) : cb = 123 //:раздел инициализации; здесь можно дописать вызов парент-конструкторов и инициализацию конст-параметров
{ //тело конструктора выполняется, когда под объект выделена память
//объекты базы создаются в том же порядке, в котором они перечислены в списке
//аналогично с инициализацией членов класса
}
}
Деструкторы – работают непосредственно с экземпляром класса, this передаётся. НЕ МОГУТ быть константными или статически, могут быть виртуальными. Если выделялись ресурсы под объект, то обязан быть описан деструктор, его задача – очищение ресурсов. Также на деструкторы возлагается функция разрыва связей.
{//так нельзя и больно
A*pobj = new A;
pobj->f();
delete pobj;
}
class A
{
Private:
int* m;
Pubic:
A(int count){m - new int[count]}
~A(){delete m;}
int f();
};
Деструктор мб виртуальным.