- •Лабораторная работа
- •Перегрузка функций
- •Значения аргументов функций, принимаемые по умолчанию
- •Константные поля
- •Изучение порядка вызова конструкторов и деструкторов
- •В) в классе определен деструктор, в котором предусмотрен только вывод сообщения
- •Изучение порядка вызова конструкторов и деструкторов (класс содержит поля данных, являющиеся объектами других классов)
- •Вопросы для контроля
Константные поля
В Си и С++ есть возможность создавать "неизменяемые" переменные, для чего используется модификатор const. Особенность их определения — значение должно задаваться в момент определения (инициализации). Позже это значение не может быть изменено (т.е. присваивание значений запрещено).
Поэтому такие идентификаторы играют роль констант. С другой стороны, с переменными их роднит наличие адреса.
Пример определения "неизменяемой" переменной:
const int a=3;
Если в классе С++ определено константное поле, то возникает вопрос, как его инициализировать, ведь просто присвоить значение в конструкторе такому полю не удастся (присваивание запрещено).
Чтобы эту решить проблему, используется специальный синтаксис, который иллюстрирует следующий пример.
class Test{
const int a;
int b;
public:
Test(int a0,int b0):a(a0){ // конструктор класса
// константное поле a инициализируется значением a0
b=b0; // b — обычная переменная, присваивание разрешено
}
};
Изучение порядка вызова конструкторов и деструкторов
ЗАДАНИЕ 1 (класс на базе структуры)
1. Создать класс Test1 с помощью служебного слова struct. Определить в классе следующие члены-данные и члены-функции.
а) Имеется одно поле данных i типа int.
б) В классе определен один конструктор с одним аргументом типа int. Этот аргумент используется для инициализации поля i и имеет значение по умолчанию, равное нулю.
Кроме присваивания значения полю i, конструктор выводит сообщение:
"Constructor, i=<значение_i>".
В) в классе определен деструктор, в котором предусмотрен только вывод сообщения
"Destructor с i=<значение_i>".
2. Чтобы контролировать последовательность выполнения программы, самый первый оператор функции main выводит сообщения "Вход в main", а последний — "Выход из main".
Замечание
В этом задании программная очистка окна вывода (clrscr) помешает следить за результатами работы программы. Поэтому ее в программе не должно быть
3. Определить глобальный объект a типа Test1, инициализировав его значением 1. В функции main определить неинициализированный объект b типа Test1.
Откомпилировать и выполнить программу. Объяснить полученные результаты.
4. Добавить в класс Test1 конструктор без параметров и с пустым телом. Откомпилировать программу. Что изменилось и почему?
В функции main закомментировать определение объекта b. Откомпилировать программу. Осталась ли ошибка? Объяснить результат компиляции.
5. Убрать комментарий с определения объекта b. Как нужно изменить конструктор с параметром, чтобы ошибка компиляции не возникала?
ЗАДАНИЕ 2 (инициализация константных полей)
1.
В новом файле с помощью служебного слова
class
определить класс Test2,
константные
поля) рамму. Какая ошибка?
компиляции.
2. В функции main определить локальный объект w класса Test2, инициализированный значением 22. Откомпилировать программу. Что произошло? Нужно ли внести изменения в программу, чтобы она заработала, и какие требуются изменения?
3. В разделе описания private класса Test2 описать поле неизменяемой переменной k типа const int. Откомпилировать программу. Какая возникла ошибка?
Предусмотреть
в конструкторе инициализацию константного поля k (добавить формальный параметр и инициализацию), а
в классе — интерфейсную функцию get_const_field, возвращающую значение этого поля.
Добавить в функцию main код, проверяющий правильность инициализации поля k.