Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_CPP-1.doc
Скачиваний:
3
Добавлен:
02.09.2019
Размер:
83.46 Кб
Скачать

Константные поля

В Си и С++ есть возможность создавать "неизменяемые" переменные, для чего используется модификатор 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, константные поля) рамму. Какая ошибка? компиляции.00000000000000000000000000000000000000000000000000000000000000000000000000000аналогичный исходному варианту класса Test1 из предыдущего задания (с одним конструктором с параметром int). Конструктор по умолчанию инициализирует поле i своих объектов значением 9.

2. В функции main определить локальный объект w класса Test2, инициализированный значением 22. Откомпилировать программу. Что произошло? Нужно ли внести изменения в программу, чтобы она заработала, и какие требуются изменения?

3. В разделе описания private класса Test2 описать поле неизменяемой переменной k типа const int. Откомпилировать программу. Какая возникла ошибка?

Предусмотреть

  • в конструкторе инициализацию константного поля k (добавить формальный параметр и инициализацию), а

  • в классе — интерфейсную функцию get_const_field, возвращающую значение этого поля.

Добавить в функцию main код, проверяющий правильность инициализации поля k.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]