На примере структуры показана инициализация членов структуры (класса) через задание списка инициализации в конструкторе структуры
struct AA {
…
AA() : a("123"), i(10) {} a("123"), i(10) - список инициализации в конструкторе
…
};
Порядок списка инициализации не важен.
А переход к классу здесь просто так не возможен. Почему?
1. Попробуйте задать значение i в конструкторе не через список инициализации, а в теле функции { i=5 }
2. Попробуйте перейти к классу.
7) программа Dc_5а.cpp
Пример Dc_5a - модификация примера для самопроверки.
В этом примере конструктор класса перегружен, т.е. определены несколько функций – конструкторов. Нужный экземпляр конструктора, компилятор находит по соответствию количества параметров, и по соответствию типов параметров.
Прочитайте программу Dc_5a и напишите на бумаге, что эта программа выводит на экран монитора. Проверьте свой результат.
8) программа Dc_6.cpp
Создание многофайловой программы с возможностью модификаций определений..
Dc_6.cpp – простая программа, которая использует тип данных “A” , определенный в других файлах (Dc_6.hpp , Dc_6.one).
В программе использованы препроцессорные средства:
строка #include "Dc_6. one " перед компиляцией «подключит» файл Dc_6. one, а последний «подключит» файл Dc_6.hpp («подключит» - вставит, как текст).
Поэтому при запуске программы отработает конструктор класса A, объявленный в файле Dc_6. one.
Посмотрим, что возможна модификация определений член-функций класса, т.е. того, как работают функции класса, без изменения объявлений член-функций класса.
Для этого поменяйте в программе имя подключаемого файла - Dc_6.one на файл Dc_1.two. Посмотрите, как изменится работа программы.
Обратите внимание, что объявление класса – файл - Dc_6.hpp осталось без изменений.
9) программа Dc_7.cpp
Ограничения класса запрещают на прямую обращаться к закрытым членам(данным) класса. Для обращения к закрытым членам(данным) класса пишутся член-функции класса.
Но бывают ситуации, например, когда такая член-функция класса должна иметь доступ к данным самого класса и другого класса, т.е. должна иметь доступ к данным двух классов. Для одного из классов такая функция будет внешней и доступ к членам класса будет ей запрещен. В языке С++ создали способ решения этой проблемы.
Внешняя функция, которой разрешено менять данные класса объявляется внутри класса - дружественной.
Программа показывает использование дружественной функции для одновременной работы с объектами двух классов.
Определены два класса – часы (watch) и микроволновка (microwave_oven).
В обоих классах есть конструктоы для начальной инициализации объектов и
есть функция изменения времени объекта – tick( ).
В программе опрелены 2 объекта – часы Big_ben и микроволновка nuke.
Как синхронизовать внутренние часы 2-х таких разных объектов.
Функция void synchronize(watch & objA, microwave_oven & objB)
объявлена дружественной функцией в обоих классах и поэтому может получать ссылки сразу на разные объекты и иметь доступ к ним.
Для того чтобы внешняя функция synchronize( ) изменила значения данных получаемого объекта, эта функция должна получить либо адрес объекта ( указатель на объект), либо ссылку на объект.
10) программа Dc_8.cpp
Вводится класс Integer . В классе Integer есть конструктор для начальной инициализации и есть функция print() для вывода значения.
Построим внешнюю функцию, котороя может поменять значение закрытой части класса.
Создадим внешнюю функцию set( ) и объявим её внутри класса дружественной с помощью ключевого слова friend . Тогда такой дружественной функции тоже откроется доступ к членам класса.
В функции set( ) требуется уточнять с каким объектом мы имеем дело: A.X = J;
Так как мы хотим изменить объект A, то вынуждены передавать его как ссылку: Integer & A
Посмотрите, что будет если передавать объект A, как значение Integer A.
11) программа Dc_9.cpp
Пример перегрузки операции квадратные скобки [ ] для класса ten_vector
intoperator[ ] (inti)
Ключевое слово operator – показывает, что перегружается операция [ ], т.е. изменяется применение операции [ ] для объектов данного типа - класса ten_vector.
Любая операция рассматривается, как функция от одного или пары аргументов. Здесь явно прописано, что это функция от одного целого аргумента - (inti).
Поэтому возможно использование оператора:
a = V[5] ;
Операция [ ] получит целое число 5 и выполнит : return element[5], т.е. извлечет значение с индексом 5.
А как сделать так, чтобы можно было написать V[5] = 20;
В левой части равенства должно стоять не значение 5-го элемента, а как бы сам 5-ый элемент.
Для этого в С++ и был введен тип данных – ссылка.
Измените тип возвращаемого значения с:intна int & :
int & operator[ ] (inti) .
Операция вернет int & .
Теперь мы сможем написать
V[5] = 20;
, потому что в левой части равенства будет стоять «псевдоним» (синоним) 5-го элемента и ему можно присвоить значение числа 20.
Использование ссылки & позволило использовать операцию [ ] в левой части равенства.
Задание (учебное):
Требуется решить задачу 2601.
Задание (проверочное):
Требуется решить задачу 2611.
-------------
а) Работающая Программа должна быть оформлена:
подписана и иметь структурированный вид
Вопросы для «продвинутых»
- Что в Лабораторной работе написано не правильно?
- Что в Лабораторной работе написано плохо?
- Что в Лабораторной работе пропущено и следует добавить?
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.