
- •Структура дисциплины
- •Процедурное программирование
- •Объектно-ориентированное программирование
- •Обобщенное программирование
- •На пути к объектно-ориентированному программированию
- •Абстракция сущностей и процедурный язык программирования
- •Абстрактный тип данных
- •Организация класса
- •Определение и объявление класса
- •Члены класса
- •Маркеры доступа
- •Конструкторы
- •Понятие об объекте
- •Организация кода при работе с классами
- •Статические компоненты класса
- •Конструкторы. Детальное рассмотрение
- •Функции getter и setter
- •Виды отношений между классами
- •Отношение зависимость
- •Отношение целое / часть
- •Разработка класса b_1.
- •Конструктор умолчания.
- •Конструктор с параметрами
- •Конструктор копирования.
- •Деструктор
- •Реализация класса b_2_1.
- •Дружественные функции и дружественные классы
- •Особенности применения дружественных функций и классов
- •Перегрузка оператров
- •Перегрузка оператора присваивания
- •Реализация перегруженного оператора присваивания для класса Array
- •Перегрузка оператора индексирования
- •Понятие о константной функции
- •Константный вариант перегруженного оператора индексирования
- •Вычисление смешанных выражений
- •Наследование
- •Структура объекта порожденного класса
- •Доступ к элементам базового класса
- •Конструкторы порожденного класса
- •Порядок создания объекта порожденного класса
- •Перегруженный оператор присваивания порожденного класса
- •Вызов виртуальной функции из тела невиртуальной функции
- •Виртуализация функций не-членов класса
- •Идиома невиртуального интерфейса (nvi)
- •Реализация механизма виртуальных функций
- •Накладные расходы при работе с виртуальными функциями
- •Чисто виртуальные функции. Абстрактные базовые классы
- •Виртуальные деструкторы
- •Автономные и базовые классы
- •Чисто виртуальный деструктор
- •Дублирование подобъектов
- •Конструкторы при виртуальном наследовании
- •Работа с данными при виртуальном наследовании
- •Обработка исключительных ситуаций
- •Завершение или продолжение
- •Распределение обязанностей между разработчиком и клиентом
- •Генерация исключений
- •Объект исключения
- •Раскрутка стека
- •Спецификации исключений
- •Работа с обработчиками
- •Формат обработчика
- •Пример обработки исключений
- •Современная точка зрения на спецификации исключения
- •Шаблоны функций
- •Объявление и определение шаблона функции
- •Примеры объявлений и определений шаблонов функций
- •Инстанцирование шаблона функции
- •Неявное инстанцирование
- •Явное инстанцирование конкретной функции
- •Структура использования шаблона функции с явным инстанцированием
- •Перегрузка шаблона функции
- •Явная специализация шаблона функции
- •Шаблоны классов
- •Использование шаблона класса
- •Наследование и шаблоны
- •Шаблоны классов и отношение включения
- •Рекурсивное использование шаблонов классов
- •Друзья и шаблоны классов
- •Явная и частичная специализация шаблона класса
- •Алгоритмы
- •Алгоритм for_each
- •Функциональные объекты
- •Алгоритм copy
- •Алгоритм sort
- •Термины и определения
- •.Литература
Определение и объявление класса
Определение класса полностью описывает (специфицирует) класс, а объявление специфицирует категорию имен, к которой относится объявляемое имя. В тех точках, где в клиентском коде создаются экземпляры класса (объекты), должно доступно определение класса. Для объявления указателя на класс достаточно располагать объявлением класса.
В связи с тем, что класс языка С++ является обобщением структур языка С его объявления и определения имеют много общего с соответствующими конструкциями для языка С.
Первое отличие классов языка С++ от структур языка С, на котором следует остановиться, состоит в следующем. Для объявлений и определений структур языка С используется зарезервированное слово struct. Для этих же целей в классе языка С++ используются три зарезервированные слова. Прежде всего, это новое зарезервированное слово class. Этого слова нет в языке Си. Оно введено в язык С++ специально для работы с классами. Однако наряду с этим зарезервированным словом допустимо использовать два зарезервированные слова языка С. Речь идет о словах struct и union.
Отметим, что классы, построенные с применением зарезервированных слов class и struct, имеют одинаковые возможности. Отличия между ними состоит в трактовке прав доступа по умолчанию. Классы, построенные с применением зарезервированного слова union, располагают существенно меньшими возможностями. Их следует применять в тех же ситуациях, что и объединение (union) языка С, когда необходима экономия памяти.
Из изложенного выше следует, что объявление класса должно иметь следующий формат:
<α> <β>;
Здесь α – одно из следующих зарезервированных слов :
-
class,
-
struct,
-
union.
β – имя класса (идентификатор).
Примеры объявлений классов.
class stack;
struct complex;
Определение класса языка С++ имеет много общего с определением структуры языка С. Оно, так же как и определение структуры языка С, должно иметь заголовок и тело.
Отметим, что заголовок порожденного класса может иметь дополнительный элемент, называемый базовым списком. Базовый список указывает, от каких базовых классов порождается определяемый класс и задает вид порождения (public, protected или private).
Таким образом, заголовок класса имеет следующий формат (в квадратных скобках записан необязательный элемент):
<α> <β> [ : <γ>]
Здесь α – одно из следующих зарезервированных слов :
-
class,
-
struct,
-
union.
β – имя класса (идентификатор).
γ – базовый список (необязательный элемент).
Следом за заголовком необходимо записать тело класса, которое должно содержать последовательность объявлений всех компонентов, принадлежащих классу. Такие компоненты принято называть членами класса. Указанные объявления должны быть заключены в фигурные скобки. Тело класса, как и тело структуры должно заканчиваться точкой с запятой.
Члены класса
В любом классе может быть определено произвольное количество членов. Это могут быть данные, функции и определения типов Илии их синонимов.
Таким образом, тело класса в общем случае может содержать следующие объявления:
-
переменных,
-
либо прототип, либо определение каждой функции, инкапсулированной в классе,
-
определения или объявления других классов.
-
объявления typedef-синонимов типов.