Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП лекция 1.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
40.61 Кб
Скачать

Язык С++ представляет собой строгое надмножество языка С и является в настоящий момент одним из наиболее распространенных языков программирования высокого уровня. Область его применения весьма широка: от написания несложных программ расчетного характера до разработки компиляторов, СУБД и операционных систем. С++ поддерживает такие традиционные технологии программирования, как структурное и модульное программирование, а также содержит широкий набор конструкций для поддержки объектно-ориентированного программирования.

С++ дает программисту возможность написания гибких и эффективных программ, что является его несомненным достоинством. Однако, С++ весьма сложен для освоения; в особенности, это касается объектно-ориентированной части языка. Указанная сложность обусловлена целым рядом факторов, в частности, большим числом синтаксических конструкций (например, одних только операций в С++ более чем в 2 раза больше, чем в языке Object Pascal), глубокой контекстной зависимостью многих элементов (к примеру, один и тот же символ согласно контексту может обозначать унарную операцию, бинарную операцию или быть разделителем), а также рекурсивным определением языка. Для С++ характерны чрезвычайно сложная система правил автоматического приведения типов, нетривиальный порядок разбора выражений и деклараций.

Язык С++ в настоящее время стандартизован; его полное описание содержится в международном стандарте ISO от 2008 года. Это несомненный плюс для тех, кто использует язык С++. Однако, изучение языка по стандарту доступно лишь профессионалам; для остальных более разумный выход – использование учебных пособий, посещение лекций и выполнение практических заданий под руководством опытных специалистов.

Понятие класса и объекта. Инкапсуляция

Основа объектной модели в языке С++ – понятие класса. Класс описывает реальное или абстрактное понятие, являясь его программной моделью. Он включает описание набора атрибутов и действий, свойственных целому множеству объектов или явлений. В С++ класс обладает правами типа данных подобно структуре, т.е. от него можно определять переменные и константы, его можно использовать в списке параметров функций и т.п. Но класс – это нечто гораздо большее, чем просто структура. Структура – лишь «пассивная» коллекция данных. Класс, в отличие от нее, обладает определенной «функциональностью».

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

Определение классов. Компоненты. Доступность

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

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

class_key /*class_id*/ { /*members_list*/ };

Элементы определения class_key и class_id образуют заголовок определения класса, а members_list – список компонент (членов) класса (в комментариях здесь и далее мы будем показывать необязательные части определений). class_key – это ключ категории класса; class_id – произвольный корректно построенный идентификатор.

Элемент class_key задает доступность и размещение компонент объектов определяемого класса в памяти, а также возможность использования класса при наследовании. Его возможные значения: class, struct, union. Если класс определить с ключом class, все его компоненты будут недоступны (закрыты) для использования извне. Если взять ключ struct, все компоненты будут доступны (открыты). Действие ключа union аналогично struct, однако он меняет способ размещения компонент объектов класса в памяти.

Основными компонентами класса являются (компонентные) данные и функции. Первые отображают свойства объектов этого класса, а вторые – их поведение. Кроме данных и функций, в определение класса могут входить типы, перечисления, структуры, объединения, битовые поля, классы, шаблоны классов, шаблоны функций. Данные включаются в класс в форме деклараций. При необходимости в них используются квалификаторы, например, const или volatile. Функции можно включить в тело класса как в форме декларации (вводится только прототип), так и в форме определения (вводится и заголовок, и тело функции). При этом если в класс включен только прототип функции, такая функция должна быть определена (реализована) за пределами класса. Если определение функции входит в тело класса, то оно строится так же, как и для функций, не входящих в классы. Если определение функции не содержится в классе, то она определяется отдельно (обычно определение класса записывается в заголовочном файле, а определения его функций – в отдельном файле с расширением «cpp»). Формат такого определения имеет следующий вид:

value_type class_id::function_id(parameters) {statements}

Оно очень похоже на обычное определение функции (есть список параметров parameters, операторы statements, тип значения value_type), но включает полное квалифицированное имя функции class_id::function_id, где :: – операция уточнения контекста.

Если компонентная функция определяется в теле класса, то она может быть реализована как inline-функция. Тело такой функции будет неявно вставляться компилятором во все точки ее вызова. Не всякая функция, определенная в теле класса, будет подставляемой. Подставляемыми обычно делаются только небольшие функции, например, конструкторы или другие функции инициализации, которые не содержат циклов и рекурсий. Подстановку функции можно обеспечить и при ее внешнем определении. Однако в этом случае в ее заголовке перед типом возвращаемого значения следует указать спецификатор inline. Следует отметить, что inline – это только «рекомендация» компилятору выполнить подстановку функции, которая может быть игнорирована.

Оставим более подробное обсуждение элементов определения класса и обратимся к примеру. Ниже дано простейшее определение класса. Класс моделирует понятие «точка на экране дисплея». Естественно, он пока весьма далек от «идеала», но тем не менее будет очень полезен для иллюстрации сути объектного подхода.

class CPoint

{

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