Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

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

class Printer

{

public:

Printer(); //Конструктор

};

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

Printer:: Printer()

{

strcpy(model, " Canon_BJC250");

year=2000;

status=0;

}

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

int main(void)

{

Printer printer; //Конструктор инициализирует

//переменные объекта

printer.show();

return 0;

}

При выполнении этой программы на экран будет выведено сообщение:

Model: Canon_BJC250 year: 2000 status: 0

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

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

class Printer

{

public:

//Конструктор с параметрами

Printer(char* _model, int _year);

};

где _model – имя параметра, соответствующего значению модели, _year – имя параметра, соответствующего значению года.

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

Теперь конструктор будет выглядеть так:

Printer:: Printer(char* _model, int _year)

{

strcpy(model, _model);

year=_year;

status=0;

}

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

int main(void)

{

//Создание первого объекта

Printer printer1(" HP5P", 1999);

printer1.show();

//Создание второго объекта

Printer printer2(" Canon_BJC250", 2000);

printer2.show();

return 0;

}

При выполнении этой программы на экран будет выведено сообщение:

Model: HP5P year: 1999 status: 0

Model: Canon_BJC250 year: 2000 status: 0

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

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

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

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

class Printer

{

public:

Printer(char* _model, int _year); //Конструктор //с параметрами

~Printer(); //Деструктор

};

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

Рассмотрим пример с классом Printer, где одно из свойств (название модели) помещается в динамической памяти:

 

class Printer

{

char* model; //указатель на строку, которая будет

//содержать название модели и разместится

//в динамической памяти

int year; //год выпуска

int status; //состояние принтера

public:

Printer(char* _model, int _year);

~Printer();

void set_print();

void stop_print();

void show();

};

Конструктор:

Printer:: Printer(char* _model, int _year)

{

int len=strlen(_model); //Определение длины

//строки

//Выделение памяти в динамической области

//для размещения строки и символа '\0'

model=new char[len+1];

strcpy(model, _model);

year=_year;

status=0;

}

 

Деструктор:

Printer:: ~Printer()

{

//Освобождение динамической памяти

delete[] model;

//Присваивание указателю значения пустого

//указателя, обязательно в Visual C++ 6.0

model = NULL;

}

Тогда программа, выполняющая все этапы работы с объектом, будет выглядеть так:

int main(void)

{

Printer printer(" HP5P", 1999); //Создание объекта

printer.show();

return 0;

}

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

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал