Типы данных: структура, класс. Конструктор, деструктор. Список инициализации. Дружественные функции. Перегрузка операций, страница 2

На примере структуры показана инициализация членов структуры (класса) через задание списка инициализации в конструкторе структуры

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.

Замечания

-------------

а) Работающая Программа должна быть оформлена:

   подписана и иметь структурированный вид

Вопросы для «продвинутых»

-  Что в Лабораторной работе написано не правильно?

-  Что в Лабораторной работе написано плохо?

-  Что в Лабораторной работе пропущено и следует добавить?