Инициализация конструкторов класса

Объекты классов с конструкторами могут быть инициализированы следую­щими способами.

Первый – при помощи задаваемого в круглых скобках списка выраже­ний, который используется как список передаваемых конструктору аргументов.

Второй – использование знака присваивания (=), за которым следует отдельное значение. Оно может иметь тип первого аргумента, принимаемого конструктором данного класса, в этом случае дополнительных аргументов либо не существует, либо они имеют значения по умолчанию. В этом случае для со­здания объекта вызывается соответствующий конструктор. Значение может также являться объектом данного типа класса. В таком случае вызывается конструктор копирования, инициализирующий объект.

Пример 11.

Демонстрация работы конструктора и деструктора в программе.

#include<iostream.h>

#include<conio.h>

class Number // описание класса

{ int i; // элемент private

public: // прототипы методов класса

Number (int j); // объявление конструктора

~Number(); // объявление деструктора

void show(); // вывод на экран

};

Number :: Number (int i) // заголовок конструктора

{ i=j; // инициализация элемента данных класса

cout<<"Работает конструктор: i="<< i <<'\n';

}

Number :: ~Number() // заголовок деструктора

{ cout<<"Работает деструктор: i="<< i <<'\n';

}

void Number :: show() // метод вывода данных на экран

{ cout<<"i= "<< i <<'\n';

}

void main() // главная функция

{ clrscr(); // чистка экрана результатов

Number ob1(25); // вызов конструктора и создание объектов

Number ob2(5);

cout<<"Вывод из объекта ob1: ";

ob1.show(); // вывод данных объекта

cout<<"Вывод из объекта ob2: ";

ob2.show();

}

Результаты программы:

Работает конструктор: i=25

Работает конструктор: i=5

Вывод из объекта ob1: i=25

Вывод из объекта ob1: i=5

Работает деструктор

Работает деструктор

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

Пример 12.

Демонстрация работы программы с объектом, созданным встроенным конструктором до начала действий функции main(). Имя объекта является пара­метром конструктора. Показан порядок конструирования объектов и разруше­ния встроенным деструктором.

#include<iostream.h>

#include<conio.h>

class Number1 // описание класса

{ char *str; // указатель на строку

public:

Number1 (char *name) // встроенный конструктор

{ cout<<"Создан объект с именем " <<name<<" класса Number1\n";

str = name; // присваивание имени элементу str класса

}

~Number1 // встроенный деструктор

{ cout<< "Объект " << str <<" разрушен\n";

}

} one ("one"); // создание объекта one с инициализацией

void main()

{ // clrscr(); // после чистки экрана не виден объект one

Nimber1 two (two); // вызов конструктора для объекта two

// getch(); // при задержке не видно работы деструктора

}

Результаты программы:

Создан объект с именем one класса Number1

Создан объект с именем two класса Number1

Объект two разрушен

Объект one разрушен

Комментарий к программе.

Для статических объектов память распределяется компилятором: конструктор вызывается перед main, а деструктор – после main. Если конструктор не определен, С++ использует неявный или встроенный. В случае автоматических объектов освобождение памяти происходит, когда нарушается область действия (заканчивается включающий блок). Любой определенный программистом деструктор вызывается, когда уничтожаются статические или автоматические объекты.

В примере компилятор автоматически вызвал конструктор при входе в программу для создания элемента локального статического объекта one. При создании автоматического объекта two конструктор был вызван явно. При выхо­де из функции main() завершается область определения объекта two и компиля­тор неявно вызывает деструктор. Второй раз деструктор вызывается при завер­шении всей программы для разрушения объекта one. Таким образом, разруше­ние объектов деструктором выполняется в порядке обратном их созда­нию конструктором.

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