Конструктор выделяет память для объекта класса и инициализирует данные-члены класса. Он вызывается автоматически для каждого объекта. Для того чтобы каждый класс имел в своем распоряжении конструктор, компилятор классов, кроме явно объявленного конструктора, предоставляет конструктор по умолчанию. Создание объекта регулируется путем описания одного или нескольких собственных конструкторов.
Для конструкторов существует несколько важных правил:
· Имя конструктора совпадает с именем его класса;
· Конструктор не имеет никакого возвращаемого значения (даже void);
· Классу без конструктора предоставляется конструктор по умолчанию;
· Если конструктор описан явно, то конструктор по умолчанию не генерируется;
· Конструкторы могут быть перегружены;
· Перегрузка чаще всего используется для передачи конструктору аргументов, предназначенных для инициализации данных-членов класса;
· Конструкторы не наследуются.
Деструкторы вызываются автоматически, если объекты классов становятся недействительными (например, при выходе за область определения или при вызове оператора delete для указателя на объект класса). Деструктор уничтожает объект и освобождает зарезервированную память.
|
|
Для деструкторов действительны правила, аналогичные правилам для конструкторов:
· Имя деструктора также совпадает с именем его класса, но предваряется символом «~» (тильдой):
~имя_класса()
· Деструктор не имеет никакого возвращаемого значения (даже void);
· Деструктор не может быть описан с ключевым словом static и const;
· Если в классе деструктор явно не описан, то компилятор генерирует деструктор по умолчанию;
· Деструктор не наследуется;
· Указатель на деструктор не может быть определен.
Деструкторы отличаются от конструкторов следующими особенностями:
· Деструкторам не могут передаваться аргументы, следовательно: деструкторы могут переопределяться, но не перегружаться, деструкторы могут описываться как virtual, деструкторы классов, производных от базовых классов, имеющих виртуальные деструкторы, автоматически становятся виртуальными;
· Деструкторы могут вызываться явно;
· Деструктор в некоторых случаях должен быть обязательно задан явно (например, если область памяти выделена с помощью оператора new).