- •Лекция № 4 Тема: Классы и обьэкты Visual c. Использование конструкторов и деструкторов в пакете Visual c план
- •Понятие класса и объекта. Спецификаторы доступа к членам класса
- •Объявления или спецификация класса
- •Int m_year; / / год издания
- •Реализация класса
- •Использование конструкторов и деструкторов в пакете Visual c
Использование конструкторов и деструкторов в пакете Visual c
Конструкторы класса
При создании объекта автоматически вызывается специальный метод, который называется конструктором (constructor). В конструктора имя класса и обязательно открытый спецификатор доступа. Конструктор управляет по ¬ строению объекта в оперативной памяти. Процесс построения включает в себя выделение памяти для членов - данных типа указателей, а также инициализацию данных.
Конструктор никогда не возвращает никакого значения и не имеет типа, даже void. Конструктор перегружается, так как объекты можно инициализировать по - разному. Количество конструкторов практически не ограничивается и за ¬ висит от целесообразности их наличии в классе. Однако существуют конструкторы, без которых не обойтись ни одному классу. Это конструктор по умолчанию, конструктор с параметрами и конструктор копирования.
Важно помнить, никакой конструктор не должен делать ничего, что касается обработки членов - данных. За обработку членов - данных несут ответственность не конструкторы, а другие методы в классе.
Инициализатор в конструкторах
Главной задачей конструктора класса является инициализация данных создаваемых им объектов. Однако проводить инициализацию данных при помощи оператора присваивания в теле конструктора не рекомендуется.
Инициализация осуществляется с помощью списка инициализации, расположенная между двоеточием, которое следует за закрывающей круглой скобкой в заголовке конструктора, и телом конструктора. Присваиваются при инициализации данных значения записываются в круглых скобках после идентификаторов членов - данных и отделяются друг от друга запятыми.
Порядок прохождения идентификаторов в списке инициализации не имеет значения.
Конструктор по умолчанию
Конструктор по умолчанию - конструктор, не требующий параметров. Этот конструктор всегда должен быть определен для любого класса. Конструктор по умолчанию может не выполнять никаких действий, но чаще всего он инициализирует данные класса нулевыми значениями.
Объявления конструктора по умолчанию имеет следующий формат :
public: имья_класy ();
Конструктор с параметрами
Конструктор с параметрами инициализирует значения данных объекта значений полученных параметров. Параметров будет столько, сколько данных необходимо проинициализуваты. Прототип такого конструктора имеет формат:
public: имя_класса (список формальных параметров);
Для класса CBооk конструктор с параметрами может иметь следующий прототип: CBook (char *, char *, int);
Листинг 14.5 - Пример реализации конструктора с параметрами
CBook :: CBook (char * author, char * title, int year)
: M_уеаr (year), m_pTitle (title)
{
strncpy_s (m_author, 50, author, 49);
if (strlen (author) > 49) m_author [ 49 ] = '\ 0';
}
В результате работы этого конструктора (листинг 14.5) будет построен объект - книга, у которого данное m_уеаг получит значение параметра year, в массив m_author копируется не более 49 байтов из строки author, и указатель m_pTitle будет содержать адрес, по которому скопировано значение title.
Конструктор копирования
Конструктор копирования создает копию объекта в оперативной памяти с помощью другого объекта того же класса. В качестве параметра этот конструктор получает ссылку на объект, копию которого необходимо создать. Для конструктора копирования необходимо указать прототип следующего формата:
public: имья_класy (имья_класy &);
Для класса CBооk конструктор копирования объявляется в спецификации класса с последующим прототипом:
CBook (CBook &);
Листинг 14.6. Пример конструктора копирования
CBook :: CBook (CBook & o): m_year (о.m_year) {
strcpy_s (m_author, strlen (o.m_author) 1, o.m_author);
nupTitle = new char [ strlen (o.m_pTitle) 1];
Strcpy_S (m_pTitle, strlen (O.m_pTitle) 1, O.m_pTitle);
}
В результате работы конструктора копирования (листинг 14.6) будет строение новый объект - книга, все члены - данные которого получат значения данных, принадлежащих копируемом объекта, переданном по ссылке. Чтобы присвоить значение названия книги вновь создаваемом объекта, нужно сначала выделить нужный блок памяти с помощью оператора new.
Деструктор
Деструктор (destructor) - специальный метод класса, используемый для разрушения объектов класса. Имя деструктора совпадает с именем конструктора (именем класса), которому предшествует символ тильда Он всегда открыт спецификатор доступа и не имеет ни типа, ни параметров. Деструктор управляет уничтожением объекта из оперативной памяти.
Вызывается деструктор автоматически при разрушении объекта. Если объект создавался динамически через указатель с помощью оператора new, то для уничтожения такого объекта следует использовать оператор delete для указателя.
Типичным использованием деструктора является освобождение динамической памяти, которая ранее была выделена конструктором.
В отличие от конструктора, деструкторов перегружается и может быть в классе только один. Лучше всегда определять деструктор класса, даже если он не производит никаких действий и имеет пустое тело.
Объявления деструктора имеет следующий формат:
public: ~ имья_класy ();
Например, для класса CBооk прототип деструктора в спецификации класса имеет вид:
~ CBook ();
Листинг 14.7
CBook () :: ~ CBook ()
{ Delete () m_pTitle;}
Результатом действия деструктора ~ CBook () является освобождение блока памяти с начальным адресом с m_pTitle, выделенного ранее конструктором класса (листинг 14.7).
Вызов конструктора и деструктора
Как упоминалось ранее, конструктор и деструктор вызываются в программе автоматически при объявлении объектов класса. Не имеет значения, объявляется объект явно или создается динамически с помощью new.
Вызов того или иного конструктора зависит от формы описания объекта:
• Если после имени объекта или типа класса в операторе new ничего не сказано или пустуют круглые скобки, вызовется конструктор по умолчанию.
• Если в скобках записаны параметры, вызывается конструктор с параметрами.
• Если в скобках находится имя объекта, то происходит вызов конструктора копирования.
Деструктор также вызывается автоматически, когда с помощью оператора delete освобождается указатель на объект класса. Без оператора delete объект разрушен не будет. Разрешается и явный вызов деструктора для объекта, который выполняется, как и вызов любого другого метода класса.
Деструкторы вызываются в порядке, обратном порядку объявления именованных объектов в программе. Вызов деструкторов объектов, объявленных через указатели, определяется прохождением операторов delete для этих указателей (листинг 14.8).
Когда вызываются конструкторы и деструкторы
Если говорить в общем, конструктор вызывается при создании объекта, а деструктор - при его уничтожении. В следующем списке подробно перечислены случаи вызова конструкторов и деструкторов для различного вида объектов.
• Объект определенный глобально (т.е. вне любой функции). Конструктор вызывается в самом начале программы до вызова функции main (или WinMain в программе, работающей в среде Windows), деструктор - по окончании программы.
• Объект определенный локально (т.е. внутри функции). Конструктор вызывается, когда поток управления достигает определения объекта, деструктор - при выходе за пределы блока, в котором определен объект (т.е. когда объект выходит из области видимости).
• Объект определенный локально с использованием спецификатора static. Кон - структор вызывается, когда поток управления впервые достигает определения объекта, деструктор - в конце программы;
• Объект создан динамически с использованием оператора new. Конструктор вызывается при создании объекта, а деструктор - когда объект явно уничтожается с использованием оператора delete. Если этого не происходит, деструкторов будет вызван никогда.
КОНТРОЛЬНЫЕ ВОПРОСЫ
Что называется классом объектов?
Дайте определение понятию класс?
Дайте определение понятию объект?
Дайте определение понятию член класса?
Наведите синтаксис описания класса?
Переменные называются данными-членами класса и функциями-членами класса?
Какую операцию называют операцией расширения области видимости, ее форма записи?
Какие вы знаете спецификаторы доступа к членам класса?
Что называется конструктором и деструкцией в объектно-ориентированном программировании, для чего они служат?
