ЗАДАНИЕ 1. Создать класс Test1 с помощью служебного слова struct
Работа добавлена на сайт samzan.net:
Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
от 25%
Подписываем
договор
Рубанчик В. Б.
|
Лабораторная №2
Использование конструкторов для создания и инициализации объектов. Изучение порядок вызова конструкторов и деструкторов.
|
2/2
|
Использование конструкторов для создания и инициализации объектов
ЗАДАНИЕ 1.
- Создать класс Test1 с помощью служебного слова struct. В этом классе имеется одно поле данных i типа int, а также конструктор и деструктор. Единственный конструктор класса предназначен для следующих действий:
- он имеет один аргумент (со значением по умолчанию равным нулю), и этот аргумент используется для инициализации переменной i;
- выводит сообщение вида:
"Создается объект с i=<значение i>".
Деструктор только выводит сообщение
- "Разрушается объект с i=<значение i>"
(остальные его действия стандартные, выполняемые по умолчанию).
- Функция main имеет первым выполняемым оператором вывод сообщения
"Вход в функцию main",
а последним - вывод сообщения
"Выход из функции main".
- Определить глобальный объект a (типа Test1), инициализировав его значением 1. В функции main определить неинициализированный объект b. Запустить программу и прокомментировать полученные результаты.
- Попытаться добавить в класс Test1 конструктор без параметров и с пустым телом. Что происходит и почему?
- Создать класс Test2, аналогичный классу Test1, но единственным отличием: он определен с помощью служебного слова class и инициализирует по умолчанию поле своих объектов значением 9. Создать глобальный неинициализированный объект w типа Test2, и локальный в main объект класса Test2, инициализированный значением 22. Запустить программу. Что происходит? Нужно ли внести изменения в программу, чтобы она заработала, и какие?
- Добавить в описание класса Test2 поле типа const int (в разделе private). Предусмотреть в конструкторе инициализацию этого поля, а в классе - интерфейсную функцию get_const_field, возвращающую значение этого поля. Проверить правильность инициализации.
Изучение порядок вызова конструкторов и деструкторов
(класс содержит поля данных, являющиеся объектами других классов)
Если в описании класса используются объекты других классов, то для конструирования объектов этого класса потребуется вызов не только его собственного конструктора, но и конструкторов для его полей-объектов. Очевидно, что при разрушении объекта такого класса потребуется вызов деструкторов для всех формирующих его классов.
Для передачи инициализирующих значений из конструктора класса конструктору, вызываемому для члена класса, используется специальный синтаксис.
Пусть описан класс Test, у которого поле field является объектом некоторого класса Example, имеющего, например, конструктор с двумя параметрами типов int и float. Тогда конструктор класса Test может быть описан следующим образом:
Test(int w, char *ptr, float t): field(w,t) {
...}
Здесь ptr - пример "собственного" аргумента конструктора Test (таких аргументов может быть несколько). Используемый синтаксис похож на правило инициализации константных полей объекта: после заголовка функции-конструктора нужно поставить двоеточие и указать имя инициализируемого поля с заключенными в круглые скобки инициализирующими значениями. Если таких полей несколько, то они описываются через запятую. (Заметим, что сохраняется и возможность обычной инициализации полей с помощью присваивания в теле конструктора).
ЗАДАНИЕ 2.
- Описать два класса Inner1 и Inner2, имеющих по одному полю типа int и по два конструктора: один без параметров, а другой - с параметром для инициализации поля данных. В каждом конструкторе предусмотреть вывод на экран соответствующего ему сообщения типа:
"Вызван конструктор с параметром для класса Inner1".
В каждом классе описать деструктор, в котором предусмотрен вывод сообщения о вызове деструктора для объекта данного класса.
- Описать класс Test, в котором имеется одно поле данных a1 типа Inner1. Создать два конструктора для класса Test (без параметров и с одним параметром int), которые выдают на экран сообщения об их вызове. Параметр конструктора использовать для инициализации поля a1. Написать деструктор класса Test, выводящий сообщение о его вызове.
- В функции main описать объект типа Test, инициализируемый произвольным целым значением. Изучить порядок вызова конструкторов и деструкторов, применяя по очереди два способа инициализации поля a1: традиционный (в теле конструктора) и новый (вне тела).
- Описать класс Inner2, аналогичный классу Inner1 (естественно, со своими сообщениями, выдаваемыми конструкторами и деструкторами).
- Изменить описание класса Test, добавив второе поле данных a2 типа Inner2 и изменив конструктор с параметром: параметр конструктора использовать для инициализации одинаковым значением полей a1 и a2 (синтаксис инициализации новый - вне тела конструктора).
- В новой функции main описать неинициализированную переменную X типа Test и запустить программу. Какие конструкторы и в каком порядке вызваны? В каком порядке вызваны деструкторы?
- В новой функции main описать переменную Y типа Test, которая инициализируется некоторым значением (например, 1). Запустить программу. Какие конструкторы и в каком порядке вызваны? В каком порядке вызваны деструкторы?
- Внести изменения в описание класса Test: поменять местами порядок описания полей a1 и a2. При условиях пункта 4 запустить программу и выяснить, как изменился порядок вызова конструкторов и деструкторов. Вернуть порядок старый описаний и поменять порядок инициализации полей в конструкторе. Влияет ли этот порядок на вызов конструкторов и деструкторов?
- Учитывая результаты пп. 3 - 5, сформулировать правила вызовов конструкторов и деструкторов для классов, с "вложенными" в них объектами других классов.
- Добавить в описание класса Test конструктор копирования Test(const Test&), который выполняет одно действие: выводит сообщение о своем вызове.
- В функцию main добавить описание новой переменной класса Test, инициализируемой значением Y (то есть, объектом того же класса). Какой из конструкторов вызывается для инициализации?