Методика демонстрации неявных вызовов специальных методов класса Appointment

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

Чтобы установить точку останова на некоторой строке программного кода, следует установить на данной строке курсор и выполнить пункт главного меню среды разработки Debug/Toggle Breakpoint (рис. 9) или нажать клавишу F9.

Рис. 9. Установка точки останова breakpoint на первой строке конструктора по умолчанию класса Appointment

Точки останова также следует установить в методе добавления нового свидания в глобальный список (рис. 10): в строке выделения памяти под динамический массив, в строке освобождения памяти, занятой «старой» версией глобального списка свиданий, в строке, содержащей фигурную скобку, закрывающую блок данной функции.

Чтобы запустить программу на исполнение в режиме пошаговой отладки, необходимо выполнить пункт главного меню среды разработки Debug/ StepOver или нажать клавишу F10. В данном режиме при каждом следующем нажатии клавиши будет F10 исполняться только одна строка кода.

Рис. 10. Установленные точки останова breakpoint в коде метода Add, реализующего добавление нового свидания в глобальный список List

На рисунке 11 представлен вид экрана среды разработки сразу после запуска программы на исполнение в режиме пошаговой отладки. Желтый курсор указывает на строку кода, которая будет выполнена при следующем нажатии клавиши F10. В данном случае, это строка, на которой располагается фигурная скобка, открывающая блок главной функции программы main (точка входа в программу).

Рис. 11. Запуск программы на исполнение в режиме пошаговой отладки

При исполнении строки кода главной функции программы, в которой объявляется объект app класса Appointment (рис. 12), должна сработать точка останова, установленная в первой строке конструктора по умолчанию (рис. 13). Код конструктора по умолчанию следует выполнить также в режиме пошаговой отладки.

Рис. 12. Исполняемая строка кода – объявление объекта app

Рис. 13. Останов в коде конструктора по умолчанию в момент объявления объекта app

При исполнении строк кода главной функции программы, в которых при объявлении объектов first и second класса Appointment, явно вызываются конструкторы инициализации, также должны срабатывать установленные в них точки останова.

При исполнении строк кода главной функции программы, в которых вызывается на исполнение функция добавления свидания в глобальный список (рис. 14), в первую очередь сработают точки останова, установленные в конструкторе копирования (рис. 15), который вызывается для формального параметра функции – объекта класса Appointment. Так как в данной функции используется механизм передачи параметра по значению, при ее вызове выделяется локальная память под формальный параметр, который инициализируется при создании уже существующим объектом - фактическим параметром.

Рис. 14. Исполняемая в пошаговом режиме строка кода –

вызов функции Add

После того, как код конструктора копирования будет исполнен в режиме пошаговой отладки, управление снова перейдет в главную функцию программы main, при этом желтый курсор пошаговой отладки останется на той же строке вызова функции добавления нового свидания в глобальный список. На следующем шаге исполнения должны сработать точки останова, установленные непосредственно в коде данной функции (см. рис. 10).

Рис. 15. Останов в коде конструктора копирования в момент вызова функции Add

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

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

После первого останова в конструкторе по умолчанию, произошедшего при вызове метода Add, следует запустить программу на исполнение без пошаговой отладки, выбрав пункт главного меню среды разработки Debug/Continue (рис. 16) или нажав клавишу F5.

При добавлении первого свидания в глобальный список, следующий останов произойдет в методе Add (в строке, в которой осуществляется освобождение динамической памяти при помощи операции delete). При добавлении второго свидания следующий останов произодет опять же в конструкторе по умолчанию, неявно вызываемом для инициализации второго элемента динамического массива. И только после его исполнения управление вернется в функцию Add.

Рис. 16. Останов в конструкторе по умолчанию при выделении динамической памяти в функции Add

 

Рис. 17. Останов в деструкторе при освобождении динамической памяти в функции Add

При исполнении строки метода Add, на которой установлена вторая точка останова (освобождение динамической памяти, занятой «старым» массивом до добавления нового элемента), должен вызываться деструктор для каждого удаляемого элемента. Так как первое свидание добавляется в пустой список, под который память не выделялась, то при первом вызове метода Add память удаляться не будет, соответственно, не будет вызываться и деструктор (останов в его коде не наблюдается). Второе свидание добавляется в список с одним элементом, при удалении которого один раз вызовется деструктор, точка останова, установленная в нем, сработает один раз (рис. 17).

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

Прежде чем продолжить демонстрацию неявных вызывов специальных методов класса, следует убрать все точки останова и установить две новых. Первую - в главной функции программы main() в строке кода, в которой осуществляется вызов функции InputAppointment (при реализации добавления нового свидания в список); вторую - в теле самой функции InputAppointment в строке кода, в которой при помощи ключевого слова ruturn возвращается результат выполнения функции.

Затем следует запустить программу в режиме отладки (F5) и выбрать пункт меню №1 – добавление нового свидания в список (рис. 18).

Рис. 18. Останов в деструкторе при освобождении динамической

памяти в функции Add

После подтверждения выбора данного пункта меню должна сработать первая точка останова (рис. 19).

Рис. 19. Останов в деструкторе при освобождении динамической памяти в функции Add

Далее следует установить точки останова во всех реализованных конструкторах и в деструкторе класса Appointment, а затем продолжить исполнение программы в режиме без останова (F5). Первой должна сработать точка, установленная в теле вызываемой функции InputAppointment (рис. 20), после чегоследует продолжить исполнение программы в режиме пошаговой отладки (F10).

Так как при возвращении результа функции явно вызывается конструктор инициализации, то при попытке выполнить данную строчку кода в первую очередь должна сработать установленная в нем точка останова. После того, как код конструктора инициализации будет выполнен в режиме пошаговой отладки (F10), управление опять вернется в функцию InputAppointment (рис. 20). Позиция курсора отладчика останется в строке возврата результирующего значения, так как инструкция данной строки не была исполнена до конца.

При следующей попытке исполнить код данной строки (F10), должна сработать точка останова в теле конструктора копирования. Конструктор копирования вызывается для объекта, созадаваемого в стеке при возвращении результата функции. После того, как код конструктора копирования будет выполнен в режиме пошаговой отладки (F10), управление опять вернется в функцию InputAppointment. Позиция курсора отладчика все еще останется в строке возврата результирующего значения(см. рис. 20).

Рис. 20. Останов в деструкторе при освобождении динамической памяти в функции Add

После того, как в стеке создастся копия неименнованого временного объекта класса Appointment, сам неименованный локальныйобъект должен быть уничтожен, поэтому в завершении иполнения данной строки должна сработать точка останова в теле деструктора. После того, как код деструкторабудет выполнен в режиме пошаговой отладки (F10), управление опять вернется в функцию InputAppointment. На этот раз позиция курсора отладчика перейдет на строку, содержащую фигурную скобку, закрывающую данный блок. Данную строку также следует исполнить в режиме пошаговой отладки (F10). При этом управление вернется в вызывающую функцию main.

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




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: