Главная страница

Сср-6. Объекты и классы


Скачать 0.98 Mb.
НазваниеОбъекты и классы
АнкорСср-6
Дата13.10.2022
Размер0.98 Mb.
Формат файлаpdf
Имя файлаCpp-6-1.pdf
ТипЗадача
#731694


Программирование в
C++
Преподаватель
Колотова Людмила Павловна

Содержание 6-го занятия по практике
2
Объекты и классы.

Простой класс. Определение класса. Вызов методов класса

Объекты программы и объекты реального мира

Объекты в качестве аргументов функций

Структуры и классы

Новый элемент программы – класс
3
Мы уже заем:
структуры
, позволяющие группировать данные, и
функции
, объединяющие фрагменты программы под одним именем.
Далее мы соединим эти два понятия и создадим новый элемент программы –
класс

Простой класс
4
В данном примере определен класс, который содержит одно поле данных и два метода, обеспечивающие доступ к полю данных. Программа main объявляет два объекта этого класса.
Задача 6-1
Рассмотрим синтаксис и основные черты классов C++.

Объединение данных и функций является стержневой идеей объектно-ориентированного программирования (ООП)
5

Определение класса
6
Определение начинается с ключевого слова
class
, за которым следует
имя класса, тело класса заключено в фигурные скобки, после которых следует точка с запятой (;)
Конструкции, связанные с типами данных, такие, как структуры и классы, требуют после своего тела наличия точки с запятой, в отличие от конструк- ций, связанных с передачей управления, например функций и циклов

Ключевой особенностью ООП является возможность сокрытия данных
7

Скрывая данные класса, его методы оставляют доступными
8

Вызов методов класса – операция точки
9
Данные, содержащиеся внутри класса, называют данными-членами или полями класса
Методы класса – это функции, входящие в состав класса
Методы класса, определенные внутри класса, по умолчанию являются встраиваемыми
Для того чтобы получить доступ к методу
класса, необходимо использовать операцию
точки (.), связывающую метод с именем объекта
Такой странный синтаксис объясняется тем, что вызов применим к методу конкретного объекта

Объекты класса
10

Объекты программы и объекты реального мира
11
Детали изделия в качестве объектов. Мы создадим класс part, основой для которого послужит структура, описывающая комплектующие изделия (см. задачу 5-1)
Задача 6-2
Этот пример уже ближе к реальной жизни. Если бы вы разрабатывали инвен- таризационную програм- му, то, вероятно, создали бы класс, аналогичный классу part. Мы привели пример объекта C++, моделирующего реально существующий объект — комплектующие изделия

Класс как тип данных
12
Задача 6-3
Данный пример, демонстрирует применение объектов C++ в качест- ве переменных типа, определенного пользователем. Объекты будут представлять время, выраженные в минутах и секундах.
Здесь демонстрируется два способа использования методов класса для инициализации полей объекта класса.

Конструкторы
13
Задача 6-4
Пример со счетчиком. Следующий пример использует счетчик, значение которого может быть изменено только с помощью его собственных методов.
Конструктор — это метод класса, выполняющийся автоматически в момент создания объекта.
Особенности конструктора:
1. Имя конструктора в точности совпадает с именем класса
2. У конструкторов не существует возвращаемого значения

Список инициализации
14
Инициализация в нашем примере происходит следующим образом:
Инициализация расположена между прототипом метода и телом функции и предварена двоеточием. Инициализирующее значение помещено в скобках после имени поля. Если необходимо инициа- лизировать сразу несколько полей класса, то значения разделя- ются запятыми, и в результате образуется список инициализации:
Конструкторы и собственные типы данных. Разработчики компиля- торов для объявления стандартных переменных предусматривают автоматический запуск необходимого конструктора, который выде- ляет память для переменных. Собственный конструктор задает инициализацию данных в памяти – мусора в данных уже не будет.

Деструкторы
15
Существует другая функция, автоматически вызываемая при уничтожении объекта и называемая деструктором.
Деструктор имеет имя, совпадающее с именем конструктора
(а следовательно, и класса) и предваряющееся символом



Объекты в качестве аргументов функций
16
Задача 6-5
В данном примере рассмотрим несколько новых аспектов создания классов:
1. перегрузка конструкторов,
2. определение методов класса вне класса и
3. использование объектов в качестве аргументов функций.

Перегрузка конструкторов
17
В момент объявления объекта компилятор автоматически встраивает в программу конструктор без параметров, который и создает переменные класса. Такой конструктор без параметров называется конструктором по умолчанию. Если же для нас важно, какими значениями будут инициализироваться поля объекта класса, то нам следует явно определить конструктор.
Теперь у нас имеется два явно определенных конструктора с одним и тем же именем Time(), и поэтому говорят, что конструк- тор является перегруженным. Какой из этих двух конструкторов исполняется во время создания нового объекта, зависит от того, сколько аргументов используется при вызове.

Определение методов класса вне класса
18
Перед именем функции add_time () стоит имя класса Time и новый символ ::. Этот символ является знаком операции глобального разрешения. Такая форма записи устанавливает взаимосвязь функции и класса, к которому относится эта функция. В данном случае запись Time::add_time () означает, что функция add_time () является методом класса Time

Объекты в качестве аргументов функций
19
Мы хотим сложить значения t1 и t2 и присвоить результат объекту t
3. Это делается с помощью вызова функции t3.add_time(t1, t2);
Синтаксис передачи объектов в функцию такой же, как и для переменных стандартных типов: на месте аргумента указывается имя объекта. Поскольку add_time() является методом класса
Time
, он имеет доступ к любым полям любого объекта класса
Time
, используя операцию точки (.). Смысл приведенного вызова можно сформулировать так: «выполнить метод add_time()
объекта t3». Типом возвращаемого значения для функции add_time
() является void. Результат автоматически присваивается объекту t3. Метод может прямо обращаться по имени к любым членам своего объекта t3. Кроме того, метод имеет непрямой
(через операцию точки) доступ к членам других объектов своего класса; которые выступают в качестве аргументов метода.

Конструктор копирования по умолчанию
20
Задача 6-6
Теперь мы рассмотрим третий способ инициализации объекта, использующий значения полей уже существующего объекта.
Компилятор предоставляет такой конструктор для каждого создаваемого класса и называется копирующим конструктором по умолчанию.
Копирующий конструктор имеет единственный аргумент, являющийся объектом того же класса, что и конструктор

Объекты, возвращаемые функцией
21
Задача 6-7
Теперь мы рассмотрим, каким образом функция может возвратить объект в вызывающую программу
Программа 6_7 очень похожа на программу 6_5, однако различия между ними указы- вают на важные аспекты работы функций с объектами.

Структуры и классы
22
Негласный принцип:

структуры предназначены для объединения данных,

а классы — для объединения данных и функций.
На самом деле, в большинстве ситуаций можно использовать структуры так же, как и классы. Формально разница между структурами и классами заключается лишь в том, что по умолчанию все члены класса являются скрытыми, а все члены структуры — открытыми. Если явно указывать private и public, то разницы нет.
Тем не менее, чаще всего программисты используют структуры для объединения данных, а классы — для объединения данных и функций.

Классы, объекты и память
23
Объекты являются самодостаточными программными единицами, созданными по образцу, представленному определением класса.
При создании объектов каждый из наборов данных занимает определенную совокупность свободных мест в памяти.
Методы класса создаются и помещаются в память компьютера всего один раз

Статические данные класса
24
Если поле данных класса описано с ключевым словом static, то значение этого поля будет одинаковым для всех объектов данного класса.
Статические данные класса полезны в тех случаях, когда необходимо, чтобы все объекты включали в себя какое-либо одинаковое значение.
Статическое поле по своим характеристикам схоже со
статической переменной: оно видимо только внутри класса.
Статическая переменная класса используется для хранения данных, совместно используемых объектами класса.

Пример использования статических полей класса
25
Задача 6-8
Следующий пример иллюстрирует простое применение статического поля класса.
Если бы мы использовали не статическое, а автоматическое поле count, то конструктор увеличивал бы на единицу значение этого поля для каждого объекта, и результат работы программы выглядел бы по другому (одни единицы)

Раздельное объявление и определение полей класса
26
Обычные поля объявляются и определяются при помощи одного оператора.
Для статических полей эти два действия выполняются двумя разными операторами: объявление поля находится внутри определения класса, а определение поля, как правило, располагается вне класса и зачастую представ- ляет собой определение глобальной переменной.

Константные методы
27
Константные методы отличаются тем, что не изменяют значений полей своего класса.
Для того чтобы сделать функцию константной, необходимо указать ключевое слово const после прототипа функции, но до начала тела функции.
Если объявление и определение функции разделены, то модификатор const необходимо указывать дважды — как при объявлении функции, так и при ее определении.
С помощью константных функций можно создавать и использовать константные объекты.

Константные методы
28
Задача 6-7a
Модификация программы 6_7.
Методы showtime() и метод
add_timet() сделаем const
Если мы хотим передать аргумент в функцию по ссылке и в то же время защитить его от изменения функцией, необходимо сделать этот аргумент константным при объявлении и определении функции

Константные объекты
29
Задача 6-9
Мы можем применять модификатор const для объектов классов.
Если объект класса объявлен с модификатором const, он становится недоступным для изменения. Это означает, что для такого объекта можно вызывать только константные методы, поскольку только они гарантируют, что объект не будет изменен.

Список задач 6-го занятия
1.
Простой класс
2.
Объекты программы и объекты реального мира
3.
Класс как тип данных
4.
Конструкторы
5.
Объекты в качестве аргументов функций
6.
Конструктор копирования по умолчанию
7.
Объекты, возвращаемые функцией
8.
Пример использования статических полей класса
7а.
Константные методы
9.
Константные объекты
30

Резюме 6-го занятия

Класс представляет собой образ, определяющий структуру своих объектов. Объекты включают в себя как данные, так и функции, предназначенные для их обработки. И данные, и функции могут быть определены как закрытые, что означает их доступность только для членов данного класса, и как открытые, то есть доступные любой функции программы. Закрытость члена класса задается ключевым словом private, а открытость — ключевым словом public.

Методом класса называется функция, являющаяся членом этого класса. Методы класса, в отличие от других функций, имеют доступ к закрытым членам класса.
31

Резюме 6-го занятия

Конструктор — это метод класса, имя которого совпадает с именем класса и который выполняется каждый раз при создании нового объекта. Конструктор не имеет типа возвращаемого значения, однако может принимать аргументы. Часто конструкторы применяются для инициализации создаваемых объектов класса.
Конструкторы допускают перегрузку, поэтому возможна инициализация объекта несколькими способами.

Деструктор — это метод класса, именем которого является имя класса, предваренное символом . Вызов деструктора производится при уничтожении объекта.
Деструктор не имеет ни аргументов, ни возвращаемого значения.
32

Резюме 6-го занятия

В памяти компьютера каждый объект имеет свои собственные участки, хранящие значения полей этого объекта, но методы класса хранятся в памяти в един- ственном экземпляре. Поле класса также можно сделать единым для всех объектов данного класса, описав его при определении класса с ключевым словом static.

Одной из главных причин использования ООП является его возможность с высокой степенью точности моделиро- вать объекты реального мира. Иногда бывает непросто представить решаемую задачу в терминах объектов и классов. Для небольших программ можно последователь- но перебрать возможные способы такого представления.
Для больших проектов применяются другие методы.
33

Контрольные вопросы
34
В качестве образца по отношению к объекту выступает:
o метод o
класс o
операция o
значение
Какие из перечисленных ниже причин являются главными для
использования объектно-ориентированных языков?

возможность создания собственных типов данных

простота операторов объектно-ориентированных языков по сравнению с процедурными языками

наличие средств для автокоррекции ошибок в объектно-ориентированных языках

объектно-ориентированные программы легче концептуализируются
В C++ функцию, входящую в состав класса, называют:
o функция-член класса o
оператор класса o
функция класса o
метод класса

35
Если язык обеспечивает возможность создания пользовательских
типов данных, то говорят, что язык называется
o наследуемым o
инкапсулируемым o
перегруженным o
расширяемым
Операция, выполняющая заданные действия над
пользовательским типом данных, называется: o
полиморфической o
инкапсулированной o
классифицированной o
перегруженной
Универсальный язык моделирования — это:

программа для построения физических моделей

средство визуализации организации программы

результат объединения языков C++ и FORTRAN

вспомогательное средство при разработке программного обеспечения
Контрольные вопросы

36
В определении класса члены класса с ключевым словом private
доступны:
o любой функции программы o
в случае, если вам известен пароль o
методам этого класса o
только открытым членам класса
Операция точки (операция доступа к члену класса) объединяет
следующие два элемента (слева направо):
o член класса и объект класса o
объект класса и класс o
класс и член этого класса o
объект класса и член этого класса
Классы полезны потому, что:

не занимают памяти, если не используются

защищают свои данные от доступа со стороны других классов

собирают вместе все аспекты, касающиеся отдельной вещи

адекватно моделируют объекты реального мира
Контрольные вопросы

37
Методу класса всегда доступны данные:
o объекта, членом которого он является o
класса, членом которого он является o
любого объекта класса, членом которого он является o
класса, объявленного открытым
Константный метод, вызванный для объекта класса:
o может изменять как неконстантные, так и константные поля o
может изменять только неконстантные поля o
может изменять только константные поля o
не может изменять как неконстантные, так и константные поля
Объединение данных и функций называется
o
Инкапсуляцией o
Полиморфизмом
Возможность выполнения оператором или функцией различных
действий в зависимости от типа операндов называется o
Полиморфизмом o
Инкапсуляцией
Контрольные вопросы

38
Задание на дом – самостоятельная работа
Решить одну ( на четыре ) или две задачи ( на пять ) из предложенных 15-ти задач программирования с использованием классов и объектов (КП_1 – КП_15)

Список задач для самостоятельной работы по практике 6-го занятия

КП_1. Класс Int

КП_2. Автострада

КП_3. Класс Time

КП_4. Класс Employee

КП_5. Класс Date

КП_6. Класс Fraction

КП_7. Класс Point. Нахождение середины отрезка

КП_8. Класс Counter

КП_9. Класс Tovar

КП_10. Класс Vedomost

КП_11. Класс Aeroflot

КП_12. Магазин обуви

КП_13. Калькулятор над дробями

КП_14. Книги

КП_15. Класс Vagon
39

40
КП_1. Класс Int
Создайте класс Int, имитирующий стандартный тип int.
Единственное поле этого класса должно иметь тип int.
Создайте методы, которые будут устанавливать значение поля, равным нулю, инициализировать его целым значением, выводить значение поля на экран и складывать два значения типа Int. Напишите программу, в которой будут созданы три объекта класса Int, два из которых будут инициализированы.
Сложите два инициализированных объекта, присвойте результат третьему, а затем отобразите результат на экране.

КП_2. Автострада
41
Представьте пункт для взимания платежей за проезд по автостраде.
Каждая проезжающая машина должна заплатить за проезд 10,50 руб., однако часть машин платит за проезд, а часть проезжает бесплатно. В кассе ведется учет числа проехавших машин и суммарная выручка от платы за проезд. Создайте модель такой кассы с помощью класса tollBooth
Класс должен содержать два поля. Одно из них, типа unsigned int, предназ- начено для учета количества проехавших автомобилей, а второе, имею- щее тип double, будет содержать суммарную выручку от оплаты проезда.
Конструктор должен инициализировать оба поля нулевыми значениями.
Метод payingCar() инкрементирует число машин и увеличивает на 10.50 суммарную выручку. Другой метод, nopayCar(), увеличивает на единицу число автомобилей, но оставляет без изменения выручку. Метод display() выводит оба значения на экран. Там, где это возможно, сделайте методы константными. Создайте программу, которая продемонстрирует работу класса. Программа должна предложить пользователю нажать (1) для того, чтобы сымитировать заплатившего автолюбителя, и (0), чтобы сымитиро- вать недобросовестного водителя. Нажатие Esc должно привести к выдаче текущих значений количества машин и выручки и завершению программы.

42
КП_3. Класс Time
Создайте класс с именем Time, содержащий три поля типа int, предназначенные для хранения часов, минут и секунд. Один из конструкторов класса должен инициализировать поля нулевыми значениями, а другой конструктор — заданным набором значений.
Создайте метод класса, который будет выводить значения полей на экран в формате 11:59:59, и метод, складывающий значения двух объектов типа Time, передаваемых в качестве аргументов. В функции main() следует создать два инициализированных объекта
(подумайте, должны ли они быть константными) и один неинициа- лизированный объект. Затем сложите два инициализированных значения, а результат присвойте третьему объекту и выведите его значение на экран. Где возможно, сделайте методы константными.

43
КП_4. Класс Employee
Создайте класс Employee. Класс должен включать поле типа int для хранения номера сотрудника и поле типа float для хранения величины его оклада. Один из конструкторов класса должен инициализировать поля нулевыми значениями, а другой конструктор — заданным набором значений. Методы класса должны позволять пользователю вводить и отображать данные класса. Напишите функцию main(), которая запросит пользователя ввести данные для трех сотрудников и выведет полученную информацию на экран.

44
КП_5. Класс Date
C
оздайте класс Date. Его данные должны размещаться в трех полях типа int: month, day и year. Один из конструкторов класса должен инициализировать поля единичными значениями, а другой конструктор — заданным набором значений. Метод класса getdate() должен принимать значение для объекта в формате 12/31/02, а метод display() — выводить данные на экран.

45
КП_6. Класс Fraction
Создайте класс Fraction. Данные класса должны быть представлены двумя полями: числителем и знаменателем. Один из конструкторов класса должен инициализировать поля числитель нулевыми значениями, а знаменатель – единицей, а другой конструктор — заданным набором значений. Методы класса должны получать от пользователя значения числителя и знаменателя дроби в форме 3/5 и выводить значение дроби в этом же формате. Кроме того, должен быть разработан метод, складывающий значения двух дробей. Напишите функцию main
(), которая циклически запрашивает у пользователя ввод пары дробей, затем складывает их и выводит результат на экран.
После каждой такой операции программа должна спрашивать пользователя, следует ли продолжать цикл.

46
КП_7. Класс Point.
Нахождение середины отрезка
Создайте класс Point . Данные класса должны быть представлены двумя полями типа float – координаты точки на плоскости x и y.
Один из конструкторов класса должен инициализировать поля нулевыми значениями, а другой конструктор – заданным набором значений. Методы класса должны: получать от пользователя значения координат точки Point ; выводить значение координат на экран и для отрезка, концы которого две точки класса Point находить координаты точки – середины отрезка. Напишите функцию main(), которая циклически запрашивает у пользователя ввод пары точек, затем выводит на экран координаты середины отрезка. После каждой такой операции программа должна спрашивать пользователя, следует ли продолжать цикл.

КП_8 Класс Counter
47
Создайте класс Counter, одно из полей которого хранит «порядко- вый номер» объекта, то есть для первого созданного объекта значение этого поля равно 1, для второго – 2 и т. д. Для того чтобы создать такое поле, вам необходимо иметь еще одно поле, в кото- рое будет записываться количество созданных объектов класса
(это означает, что последнее поле должно относиться не к отдель- ным объектам класса, а ко всему классу в целом. Вспомните, какое ключевое слово необходимо при описании такого поля.). Каждый раз при создании нового объекта конструктор может получить значение этого поля и в соответствии с ним назначить объекту индивидуальный порядковый номер. В класс следует включить метод, который будет выводить на экран порядковый номер объекта. Создайте функцию main(), в которой будут созданы три объекта, и каждый объект выведет на экран свой порядковый номер, например:
Мой порядковый номер: 2 и т. п.

48
КП_9. Класс Tovar
Создайте класс Tovar, содержащий три поля: код товара типа int, цена товара типа float и год выпуска типа int. Один из конструк- торов класса должен инициализировать поля нулевыми значени- ями, а другой конструктор — заданным набором значений. Метод класса getdate() должен принимать значение для объекта, а метод display() — выводить данные на экран. Создайте три объекта класса Tovar, первый инициализируйте в момент объявления, а данные для двух других запросите с клавиатуры.
Выведите информацию о каждом товаре на экран.

49
КП_10. Класс Vedomost
Создайте класс Vedomost, одно из полей которого хранит
«порядковый номер» объекта, а два других типа int: код предмета и оценку по данному предмету. Для того чтобы создать
«порядковый номер» объекта, вам необходимо иметь еще одно поле, в которое будет записываться количество созданных объектов класса (которое относится ко всему классу в целом).
Один из конструкторов класса должен инициализировать поля нулевыми значениями, кроме счетчика, а другой конструктор — заданным набором значений. Метод класса getdate() должен принимать значение для объекта, а метод display() — выводить данные на экран. В основной программе создаем три объекта класса Vedomost, делаем запрос на сдачу экзаменов и печатаем информацию на экране.

50
КП_11. Класс Aeroflot
Создайте класс Aeroflot, содержащий поля типа int: для номера рейса, номера пункта назначения и количества билетов для данного рейса и пункта назначения. Один из конструкторов класса должен инициализировать поля нулевыми значениями, а другой конструктор — заданным набором значений. Метод класса getdate() должен принимать значение для объекта, а метод display () — выводить данные на экран. Создайте три объекта класса Aeroflot, введите информацию с клавиатуры.
Выведите информацию о каждом объекте на экран, подсчитайте общее количество билетов и выведите на экран.

51
КП_12. Магазин обуви
Создать структуру Sandals с полями типа int для кода обуви, размера и стоимости пары обуви. В течение дня было продано три пары обуви. В основной программе ввести данные для продаж трех пар обуви, подсчитать количество пар обуви 39 размера и распечатать всю информацию.

52
КП_13. Калькулятор над дробями
Создайте класс Fraction, состоящей из двух полей типа int, для числителя и знаменателя дроби. Написать метод, который производит вычисление над дробями. Основная программа запрашивает ввод двух дробей и операцию. Результат выводится на экран в виде дроби и в виде десятичного числа. Все значения дробей должны храниться в переменных типа Fraction.
Формулы, демонстрирующие выполнение арифметических операций над дробями, приведены ниже: сложение: a/b+c/d=(a*d+b*c)/ (b*d
) вычитание: a/b-c/d=(a*d-b*c)/(b*d) умножение: a/b*c/d=(a*c)/(b*d) деление: a/b/c/d = (a*d)/(b*c).

53
КП_14. Книги
Создать класс Kniga с полями типа int шифр книги, год издания, цена и количество страниц. Основная программа запрашивает данные для ввода информации по пяти книгам, подсчитывает количество книг за 2014 год и выводит на экран только книги за
2014 год. Если таких книг нет – выводит сообщение об этом.

54
КП_15. Класс Vagon
Создайте класс Vagon с полями: номер вагона, количество спальных мест, количество общих (сидячих) мест. В поезде 4-е вагона. В основной программе ввести информацию о вагонах, подсчитать общее число всех мест, в том числе количество спальных и количество общих мест. Информацию о вагоне с максимальным числом всех мест напечатать.

xxx.h: No such file or directory не найден заголовочный файл 'xxx.h' (неверно указано его имя, он удален или т.п.)
'xxx' undeclared (first use this
function) функция или переменная 'xxx' неизвестна
missing terminating " character
не закрыты кавычки "
expected ; нет точки с запятой в конце оператора в предыдущей
строке
expected } не закрыта фигурная скобка
55
Наиболее «популярные» ошибки

Конец
56


написать администратору сайта