Вопрос . Конструкторы и деструкторы

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

Конструктор включается в состав класса в разделе public:

Конструктор выделяет память под объект, достаточную для размещения всего объекта, и инициализирует переменные состояния объекта:

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

Имена параметрам могут быть даны любые, но удобно, когда имена параметров совпадают с названиями соответствующих свойств, отличаясь от них лишь первым символом _ (знак подчеркивания). Такой прием позволяет не запутаться при написании конструктора. Однако применять его можно лишь в том случае, если компилятор позволяет ставить знак _ в начале идентификатора

В состав класса может быть включено несколько конструкторов, что обосновано таким свойством языка C++, как перегрузка функций. Конструкторы обязательно должны отличаться количеством или типами параметров, чтобы компилятор мог подобрать конструктор, соответствующий создаваемому объекту.

Класс может не содержать ни одного конструктора, в этом случае для создания объекта создается конструктор по умолчанию, который выделяет память под объект, но при этом не инициализирует переменные.

Для разрушения объекта используется метод, называемый деструктором. Для деструктора, также как и конструктора, не указывается тип возвращаемого значения, имя совпадает с именем класса, только перед именем помещается знак ~(тильда).

Деструктор не имеет параметров и включается в раздел public:

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

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

Конструктор – это функция-член класса, которая вызывается автома­тически для создания и инициализации экземпляра класса. Известно, что экземпляры структур можно инициализировать при объявлении:

struct Student{

int semhours; //public по умолчанию

char subj; }

Student s={0,”c” };//объявление и инициализация

При использовании класса приложение не имеет доступа к его защищенным элементам, поэтому для класса подобную инициализацию выполнить нельзя. Для этой цели используются специальная функция-член класса, инициализирующая экземпляр класса и указанные переменные при создании объекта. Подобная функция вызывается всегда при создании объекта класса. Это и есть конструктор – функция-член класса, которая имеет то же имя, что и класс. Конструктор может быть подставляемой (inline) и неподставляемой функциями. Рассмотрим пример:

#include<iostream.h> // пример 22

class Student{

int semhours;

char subj;

public:

Student() //inline-конструктор 1 без параметров

{semhours=0; subj='A';}

Student(int, char); //объявление конструктора 2 с параметрами

};

Student::Student(int hours,char g)//конструктор 2

{semhours=hours; subj=g;}

int main(){

Student s(100,'A'); //конструктор 2

Student s1[5]; //конструктор1 вызывается 5 раз

return 0;

}

Там, где находятся объявления s и s1, компилятор помещает вызов соответствующего конструктора Student().

Конструктор не имеет типа возвращаемого значения, хотя может иметь аргументы и быть перегружаемым. Он вызывается автоматически при создании объекта, выполнении оператора new или копировании объекта. Если конструктор отсутствует в классе, компилятор С++ генерирует конструктор по умолчанию.

Деструктор вызывается автоматически при уничтожении объекта и имеет то же имя, что и класс, но перед ним стоит символ “~”. Деструктор можно вызывать явно в отличие от конструктора. Конструкторы и деструкторы не наследуются, хотя производный класс может вызывать конструктор базового класса.

Вопрос . Наследование

Наследование – это принцип ООП, посредством которого на базе существующих классов создаются новые классы, получающие по наследству от базовых классов свойства и методы. Наследование позволяет существенно экономить программный код.

Наши рекомендации