Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.03 Mб
Скачать

3.2.1 Описание класса

В С++ для описания класса введён новый составной тип class. Кроме того, понятие структуры (struct) и объединения (union) расширено до поддержки концепции ООП. Таким образом, при описании класса можно пользоваться всеми тремя типами. Далее мы будем употреблять термин "класс", вне зависимости от того, каким способом выполнено его описание.

Заметим, что ключевое слово union используется в ООП достаточно редко и для специфических применений. А class и struct можно рассматривать как очень близкие языковые понятия. Небольшая синтаксическая разница между class и struct все-таки есть, чуть позже мы ее поясним. Итак, в общем виде описание (определение) класса выглядит так:

class | struct | union {тело класса};

В теле класса указываются все составляющие его элементы. Для полей указываются имена, типы и возможные спецификаторы. Для методов можно указать их прототипы или полные определения. Рекомендуется в теле класса размещать определения только для очень коротких методов, а большинство методов реализовывать за пределами класса. Определения классов обычно размещаются в файлах с расширением .h, а реализация методов – в файлах с расширением .cpp. Такой подход имеет сразу два преимущества:

  • определение класса имеет лаконичный и удобный для восприятия вид, особенно при удачно подобранных названиях элементов класса;

  • реализация методов класса в отдельных файлах позволяет значительно ускорить компиляцию больших проектов, так как большая часть кода будет компилироваться только один раз.

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

3.2.2 Область видимости элементов класса. Инкапсуляция

Все элементы класса (и поля, и методы) можно разделить на три группы в зависимости от их области видимости:

  1. public:

открытые элементы, к которым имеется доступ из любого участка программы, использующей класс

  1. private:

скрытые элементы, которыми можно пользоваться только при реализации методов этого класса. Больше они нигде не доступны.

  1. protected:

защищенные элементы можно использовать при реализации методов этого класса и его потомков (т.е. область видимости немного шире, чем у элементов из группы private)

Возможность управления областью видимости каждого элемента класса по отдельности позволяет воплотить на практике принцип инкапсуляции.

Поля класса обычно объявляют в ограниченной области видимости private или protected (в расчёте на будущих наследников). Таким образом, прикладная программа, использующая класс, не может записать в поля любые значения, среди которых могут оказаться и недопустимые. Доступ к полям надёжнее выполнять через методы, которые не позволят занести в поля недопустимые значения. Отсюда и термин "инкапсуляция" – поля как бы заключены в капсулу из защищающих их методов.

Возможны и исключения из этого правила – в некоторых случаях поля не нуждаются в защите через методы. Этот вопрос нужно решать индивидуально, исходя из специфики класса и его полей.

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

Теперь, наконец, пришло время сказать, в чём заключается отличие описаний класса с использованием типов class и struct.

Область видимости по умолчанию для типов class и struct. Если при описании класса область видимости каких-либо элементов явно не задана, то для типа class подразумевается private, а для типа structpublic. Можно и так сказать, что тип класса более надёжно защищает свои элементы (даже от невнимательности программиста).

Методы-константы. Можно считать эту возможность ещё одним (дополнительным) способом защиты полей класса. Она заключается в том, что при описании методов, которые не изменяют значений полей класса, можно добавить в заголовок спецификатор constон помещается в конец заголовка после списка формальных параметров. Наличие этого спецификатора заставляет компилятор выполнить дополнительную проверку, чтобы убедиться, что данный метод действительно не меняет значения ни одного из полей, т.е. он относится к методам-константам.

Спецификатор const никак не влияет на функциональность метода, однако, его применение рекомендуется для повышения надёжности программного кода.

Создание и использование объектов в С++. Как уже было сказано, объекты − это переменные заданного класса, поэтому работа с ними выполняется, как и с переменными других типов.

Глобальные объекты создаются во время запуска программы. Для того чтобы создать глобальный объект, необходимо его объявить вне функции main и других функций:

К таким объектам можно обратиться из любой точки программы. Главное − следить за изменениями данных объектов, т.к. неуправляемое изменение глобальных объектов может вести к трудно находимым ошибкам.

Автоматические объекты создаются при входе в функцию и удаляются при выходе из неё. Использование данного объекта возможно только в пределах этой функции.

Управляемые объекты создаются и удаляются с помощью операторов new и delete. При создании эти объекты помещаются в "кучу", поэтому очень важно следить за тем, чтобы каждому new соответствовал оператор delete, иначе будут утечки памяти.

Для обращения к полям и методам объектов используются символы "." и "->”. Точка используется, когда к объекту обращаются по имени. Операция "->" используется когда обращаются к объекту через указатель на объект.

Теперь мы получили достаточно информации, чтобы перейти к примерам.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]