§ 2. Классы
Сайт: | Профильное обучение |
Курс: | Информатика. 11 класс (Повышенный уровень) |
Книга: | § 2. Классы |
Напечатано:: | Гость |
Дата: | Суббота, 19 Апрель 2025, 19:00 |
2.1. Структура класса
Напомним основные понятия, связанные с описанием класса. В примере 2.1 используется класс Student. Имя класса принято писать с заглавной буквы. В общем виде описание класса выглядит следующим образом: class имя_класса { private: /* список свойств и методов для использования внутри класса */ public: /* список методов, доступных другим функциям и объектам программы */ protected: /*список средств, доступных для дружественных классов и наследников*/ }; Все свойства и методы классов имеют права доступа. По умолчанию все содержимое класса является доступным для чтения и записи только для него самого. Для того чтобы разрешить доступ к данным класса извне, используют модификатор доступа public. Все функции и переменные, которые находятся после модификатора public, становятся доступными из всех частей программы. Закрытые данные класса размещаются после модификатора доступа private. Если отсутствует модификатор public, то все функции и переменные по умолчанию являются закрытыми. Обычно приватными делают все поля класса, а публичными — его методы. Все действия с закрытыми полями класса реализуются через его методы. Поскольку метод в классе является функцией, то и описывают методы так же, как описывают функции. Объявляют методы внутри класса, а определение методов может быть как внутри класса, так и вне его. Определение методов вне класса позволяет при необходимости легко вынести их в отдельный файл. Определения методов класса очень похоже на обычные определения функций. Каждый из методов имеет заголовок и тело, может иметь тип возвращаемого значения и параметры. Но есть и отличия:
Поскольку данные в классе являются приватными, пользователь не может напрямую определить или изменить значения данных. Для этих целей используются специальные методы. В классах принято объявлять так называемые set- и get-функции (в русскоязычной литературе их иногда называют сеттеры и геттеры), с помощью которых можно работать с элементами данных. Таких функций в классе может быть несколько. На объекты классов, как и на объекты других типов, можно определять указатели. Затем через указатель можно обращаться к членам класса — переменным и методам (пример 2.2). Однако если при обращении через обычную переменную используется символ точка, то для обращения к членам класса через указатель применяется стрелка «–>» (знаки «минус» и «больше»). [1] Значок обозначает операцию «раскрытие области видимости». |
Пример 2.1. Программа для решения следующей задачи: «Прочитать из текстового файла данные о студентах (фамилия, город, год рождения, отметки ЦТ) и вывести в файл в порядке убывания суммарного балла фамилии, город и суммарный балл».
Пример 2.2. Обращение через указатель к членам класса Date (пример 22.5 учебного пособия 10 класса, http://profil.adu.by/mod/book/view.php?id=3574&chapterid=10521#pr5).
Изменения по указателю d5 в данном случае приведут к изменениям объекта d4. В результате выполнения команд будет выведено 17.3. |
2.2. Конструкторы
Для начальной инициализации класса используются конструкторы. Конструктор — специальный тип метода класса, который автоматически вызывается при создании объекта этого же класса. Конструкторы обычно используются для инициализации полей объекта класса (пример 2.3). В отличие от обычных методов конструкторы имеют определенные правила именования:
В классе может быть несколько конструкторов. Конструктор, который не имеет параметров, называется конструктором по умолчанию. Он вызывается, если пользователем не указаны значения для инициализации. Конструкторы также могут быть объявлены с параметрами, которые используются для инициализации полей. В классе можно определить любое количество конструкторов, каждый из которых должен иметь уникальные параметры. В конструкторе может быть использован список инициализации полей класса. Список инициализации располагается после параметров конструктора. Он начинается с двоеточия (:), а затем значение для каждого поля указывается в круглых скобках. В теле конструктора не нужно выполнять операции присваивания, поэтому тело конструктора может быть пустым. Список инициализации членов класса не заканчивается точкой с запятой (пример 2.4). Каждый метод класса неявно содержит в качестве поля данных указатель: ИмяКласса *this; С его помощью метод класса определяет, с данными какого объекта ему предстоит работать. Указатель this можно использовать в конструкторах (пример 2.5). Деструктор класса — еще один специальный метод — вызывается при уничтожении объекта. Имя деструктора аналогично имени конструктора, только в начале ставится знак тильды: ~. Деструктор не имеет входных параметров. Деструктор всегда один. Для простых классов (тех, которые только инициализируют значения обычных свойств) деструктор не нужен, так как C++ автоматически выполнит очистку памяти самостоятельно. Деструкторы не вызываются пользователем явно. Однако их могут безопасно вызывать другие методы класса, т. к. объект не уничтожится до тех пор, пока не выполнится деструктор. |
Пример 2.3. Добавление конструкторов в класс Student.
Функция для ввода данных с использованием конструктора изменится следующим образом:
Пример 2.4. Использование списка инициализации при описании конструкторов в классе Student.
Переменные в списке инициализации получают свои значения не в том порядке, в котором они указаны, а в том порядке, в котором объявлены в классе. Поэтому при использовании списков инициализации лучше сохранять тот же порядок полей, который задан при описании класса. Пример 2.5. Использование указателя this в конструкторе класса Date.
|
2.3. Целочисленный тип данных
Рассмотрим примеры использования классов. Пример 2.6. Реализовать класс для описания геометрической фигуры — Figure и его наследников — круг (Circle) и треугольник (Triangle). У базового класса нужно определить общий метод square(), который возвращает площадь геометрической фигуры, а у наследников реализовать этот метод. Продемонстрировать работу методов. Этапы выполнения задания 1. Описать базовый класс Figure.
2. Описать класс наследник Circle.
3. Описать класс наследник Triangle.
Пример 2.7. Задана дата рождения человека и текущая дата. Определить количество полных лет, прошедших со дня рождения. Для решения задачи использовать класс Data. Разделить объявление и определение класса, создав файлы Date.h и Date.cpp. Этапы выполнения задания 1. Класс Date был описан в примере 22.5 учебного пособия 10 класса (http://profil.adu.by/mod/book/view.php?id=3574&chapterid=10521#pr5). В класс необходимо добавить функции-геттеры для получения дня, месяца и года. 2. Добавить файлы.
3. Заголовочный файл содержит объявление класса (реализацию) и описание библиотек (если они необходимы). 4. Файл Date.cpp содержит определение методов класса. Чтобы связать определение класса и его реализацию, необходимо в файле реализации подключить заголовочный файл с объявлением класса: #include "Date.h". Обратите внимание, что при подключении файла его имя берется в кавычки, а не в угловые скобки. 5. В файле main.cpp также необходимо подключить заголовочный файл.
|
Пример 2.6. Программа.
Тестирование: Абстрактный класс, который содержит только виртуальные методы, называется интерфейсом. Тогда абстрагирование — это необходимость сконцентрироваться на интерфейсе, не обращая внимания на реализацию. Интерфейсы позволяют наладить множественное наследование объектов и решить проблему ромбовидного наследования (ситуация, когда два класса B и C наследуют от A, а класс D наследует от обоих классов B и C. Имя интерфейса строится по тем же правилам, что и другие идентификаторы языка программирования. Однако для интерфейсов могут применяться дополнительные правила, которые помогают отличать имя интерфейса от имен других элементов программы. Например, в технологии COM и во всех поддерживающих её языках действует соглашение, следуя которому, имя интерфейса строится по шаблону «I<Имя>», то есть состоит из написанного с заглавной буквы осмысленного имени, которому предшествует заглавная латинская буква I, например IFigure.Пример 2.7. Содержимое файла main.cpp.
Содержимое файла Date.h.
|
Вопросы к параграфу
![]() |
1. Какие разделы содержит описание класса? 2. К какому разделу относятся поля и методы, если название раздела явно не прописано? 3. В чем преимущество раздельного объявления и определения методов класса? 4. Для чего используются set- и get-функции? 5. Для чего нужен конструктор? 6. Сколько конструкторов может быть описано в классе? |
Упражнения
1. Разделите объявление и определение класса Student (примеры 2.1 и 2.3), создав файлы Student.h и Student.cpp.
2. Добавьте для базового класса, описанного в примере 2.6, в качестве наследников трапецию и параллелограмм. Опишите для них методы вычисления площадей.
3. Продумайте иерархию наследников для четырехугольников (количество наследников не менее 2). Реализуйте базовый абстрактный класс и дочерние классы. В качестве методов реализуйте функции для вычисления площади, периметра и длины диагонали.
4. Создайте класс Parallelepiped (прямоугольный параллелепипед). Конструктор принимает длины ребер. Реализуйте функции вычисления площадей основания и боковых граней, объема, длин диагоналей параллелепипеда и диагоналей основания и боковых граней. Сделайте проверку на то, что параллелепипед является кубом.
5. В отделе кадров информация о работниках хранится в следующем виде: фамилия и инициалы, название занимаемой должности, дата поступления на работу. Выведите в алфавитном порядке тех работников, стаж работы которых больше введенного значения на текущую дату (дата вводится). Опишите класс Worker, в котором должен быть реализован метод, вычисляющий стаж работы.
6. Создайте класс Rect для прямоугольников со сторонами, параллельными осям координат. Реализуйте перемещение прямоугольника на плоскости (по горизонтали, по вертикали, в направлении вектора), изменение размеров.