
- •Методические указания к лабораторным работам
- •Лабораторная работа №1 простые программы с циклами и операторами консольного ввода/вывода
- •Задание
- •Описание примера
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №2 работа с текстовыми файлами, структурами данных и меню
- •Задание
- •Структурное программирование и функциональная декомпозиция системы
- •Функции
- •Организация меню в консольном приложении
- •Структуры данных
- •Операции с файлами
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №3 разработка и спецификация функций и модулей программы
- •Задание
- •Модульная структура программ
- •Параметры командной строки
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №4 разработка и спецификация структур данных, использование указателей и динамических массивов структур
- •Задание
- •Указатели
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №5 использование объектно-ориентированного программирования в разработке приложений
- •Задание
- •Конструкторы и деструкторы
- •Конструктор по умолчанию
- •Конструктор копирования
- •Массивы объектов
- •Friend-конструкции
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №6 использование наследования, полиморфизма и абстрактных классов
- •Задание
- •Наследование данных и методов
- •Полиморфизм и виртуальные функции
- •Абстрактный класс
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №7
- •Сложные структуры из объектов классов
- •Цель работы - изучение организации различных структур данных и разработка методов манипулирования данными.
- •Задание
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №8 разработка windows-интерфейса приложения
- •Задание
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №9 разработка и использование com-сервера
- •Задание
- •Шаблоны классов
- •Использование библиотеки atl для создания серверов сом
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Литература
Конструкторы и деструкторы
Среди всех методов любого класса выделяются два (конструктор и деструктор), которые определяют, каким образом объекты класса создаются, инициализируются, копируются и разрушаются.
Конструктор выполняет особую функцию — он служит для автоматического создания и инициализации объекта класса в точке его определения. Конструктор носит то же имя, что и сам класс, в котором он определен. Конструктор ничего не возвращает в точку вызова, и при объявлении он не должен иметь описатель типа возвращаемого значения.
Деструктор используется для освобождения памяти, занимаемой членами класса. Особенно важную роль играет деструктор в случае динамического выделения памяти из области heap. Как известно, такую память следует явно освобождать операцией delete. Если тело деструктора создано, то он сделает это автоматически, как только закончит работу функция, в которой определен объект данного класса. Он неявно вызывается в случае выхода программы из области действия объекта. Деструктор носит имя класса, в котором он определен, но перед его именем должен стоять символ ~. Например, описание А::~А(){}; задает деструктор класса А, а А::А(){}; определяет его конструктор.
Конструкторы и деструкторы наряду с характеристиками обычных методов обладают и некоторыми уникальными свойствами:
Конструктор всегда имеет то же имя, что и сам класс; это же относится и к деструктору, которому, однако, предшествует символ "~" (тильда).
Не имеют объявлений возвращаемых значений (даже void).
Конструкторы, как и большинство функций C++, могут иметь аргументы по умолчанию или использовать списки инициализации элементов.
Если конструкторы или деструкторы не были определены явно, они генерируются компилятором.
Конструктор нельзя вызывать как обычную функцию; вызов деструктора возможен с полностью уточненным именем.
При определении и разрушении объектов вызов конструкторов и деструкторов осуществляется автоматически.
Конструкторы и деструкторы, при необходимости выделения объекту памяти, могут выполнять неявные вызовы операций new и delete.
Правила, по которым происходит создание/уничтожение объектов:
Конструкторы и деструкторы автоматически запускаются всякий раз при создании и разрушении объектов.
Глобальные и локальные статические объекты создаются в начале выполнения программы — до того, как управление попадает в функцию main. Уничтожение таких объектов происходит в момент завершения программы в результате возврата из функции main.
Локальные объекты создаются, когда программа встречает их определение, и уничтожаются при выходе из функции.
Конструктор объекта, память которому выделяется в куче (посредством операции new), вызывается автоматически, при вызове new; такой объект разрушается при явной передаче объекта в оператор delete.
// Простой пример, демонстрирующий последовательность вызовов конструкторов и деструкторов
#include <stdio.h>
#include <string.h>
// Объявляем класс
class Sample{
private: // К этим данным доступ возможен только посредством методов класса
char *strName;
public: // К этим данным доступ возможен из любого места программы
// Определяем простой конструктор
Sample (char *str) {
strName = new char [strlen (str) + 1] ;
strcpy(strName, str);
printf("Entry in constructor for %s\n", strName);
}
// Определяем деструктор
~Sample(){
printf("Entry in destructor for %s\n", strName);
delete strName;
strName = 0;
}
};
Sample globall("global #1"); // Определяем первый глобальный объект
// "Глупая" функция, иллюстрирующая создание автоматического объекта
void SillyFunc(){
// Определяем объект, локальный для данной функции
Sample fnAuto("automatic function");
printf("Function SillyFunc()\n");
}
int main(int argc, char* argv[])
{
// Определяем первый локальный объект
Sample autol("automatic #1");
printf("Begin main()\n");
SillyFunc();
// Определяем второй локальный объект
Sample auto2("automatic #2");
printf("Continue main()\n");
return 0;
}
Sample global2("global #2"); // Определяем второй глобальный объект
Результаты работы программы:
Entry in constructor for global #1
Entry in constructor for global #2
Entry in constructor for automatic #1
Begin main()
Entry in constructor for automatic function
Function SillyFunc()
Entry in destructor for automatic function
Entry in constructor for automatic #2
Continue main()
Entry in destructor for automatic #2
Entry in destructor for automatic #1
Entry in destructor for global #2
Entry in destructor for global #1
Press any key to continue
Один и тот же класс может иметь несколько конструкторов, если каждый из них имеет свой собственный список аргументов. При определении объекта будет запущен тот конструктор, с которым совпадает заданный список аргументов. В качестве аргумента конструктора нельзя использовать объект того же класса. Вместо этого можно использовать ссылку на объект.
Некоторые конструкторы играют особую роль.