- •1)Краткий обзор основных парадигм программирования
- •Основные принципы ооп
- •Абстрактные типы данных
- •Синтаксис описания класса
- •Управление доступом к членам класса
- •Манипуляции с состоянием объекта
- •Класс как область видимости
- •Объявление и определение методов класса. Спецификатор inline
- •Указатель на член класса
- •Указатель this
- •Конструкторы и деструкторы
- •Конструктор умолчания
- •Конструктор преобразования и конструкторы с двумя и более параметрами
- •Конструктор копирования
- •Порядок вызова конструкторов и деструкторов
- •Статические члены класса
- •Константные члены класса. Модификатор const
- •Друзья классов
- •Статический полиморфизм
- •Перегрузка бинарных операций
- •Перегрузка унарных операций
- •Перегрузка функций
- •Виды отношений между классами
- •Одиночное наследование
- •Правила наследования
- •Преобразования указателей.
- •Правила видимости при наследовании.
- •Закрытое (private) наследование
- •Перекрытие имен
- •Динамический полиморфизм, механизм виртуальных функций
- •Реализация виртуальных функций
- •Абстрактные классы. Чистые виртуальные функции
- •12. Средства обработки ошибок, исключения и обработка исклю-чений
- •Правила выбора обработчика исключения
Абстрактные типы данных
Типы данных, создаваемые пользователем (программистом), называются пользовательскими типами данных. Пользовательский тип данных с полно-стью скрытой (инкапсулированной) внутренней структурой называется абст-
рактным типом данных (АТД).
В С++ АТД реализуется с помощью классов, в которых нет открытых чле-нов-данных, то есть вся структура этих классов скрыта от внешнего пользователя.
Классы и объекты С++
Центральным понятием ООП является класс. Класс используется для опи-сания типа, на основе которого создаются объекты (переменные типа класс).
Класс, как и любой тип данных, характеризуется множеством значений, которые могут принимать объекты класса, и множеством функций, задающих операции над объектами.
Синтаксис описания класса
class Имя_класса { определение_членов_класса };
Члены класса можно разделить на информационные члены и функции-члены (методы) класса. Информационные члены описывают внутреннюю структуру информации, хранящейся в объекте, который создается на основе класса. Методы класса описывают алгоритмы обработки этой информации.
Данные, хранящиеся в информационных членах, описывают состояние объекта, созданного на основе класса. Состояние объекта изменяется на основе изменения хранящихся данных с помощью методов класса. Алгоритмы, зало-женные в реализации методов класса, определяют поведение объекта, то есть реагирование объекта на поступающие внешние воздействия в виде входных данных.
Управление доступом к членам класса
Принцип инкапсуляции обеспечивается вводом в класс областей доступа:
private (закрытый, доступный только собственным методам)
public(открытый, доступный любым функциям)
protected (защищенный, доступный только собственным методам и
методам производных классов)
Члены класса, находящиеся в закрытой области (private), недоступны для использования со стороны внешнего кода. Напротив, члены класса, находящиеся в открытой секции (public), доступны для использования со стороны внешнего кода. При описании класса каждый член класса помещается в одну из перечис-ленных выше областей доступа следующим образом:
class Имя_класса { private:
определение_закрытых_членов_класса public:
определение_открытых_членов_класса protected:
определение_защищенных_членов_класса
…
};
Порядок следования областей доступа и их количество в классе – произ-вольны.
Служебное слово, определяющее первую область доступа, может отсутст-вовать. По умолчанию эта область считается private.
закрытую (private) область обычно помещаются информационные члены, а
открытую (public) область – методы класса, реализующие интерфейс объектов класса с внешней средой. Если какой-либо метод имеет вспомогательное значе-ние для других методов класса, являясь подпрограммой для них, то его также следует поместить в закрытую область. Это обеспечивает логическую целост-ность информации.
После описания класса его имя можно использовать для описания объектов этого типа.
Доступ к информационным членам и методам объекта , описанным в от-крытой секции, осуществляется через объект или ссылку на объект с помощью
операции выбора члена класса ‘.’.
Если работа с объектом выполняется с помощью указателя на объект, то доступ к соответствующим членам класса осуществляется на основе указателя на член класса‘->’:
class Х { public:
char c; int f(){…}
};
int main () {
x1;
& x2 = x1;
* p = & x1; int i, j, k; x1.c = ‘*’; i = x1.f(); х1.с = '+'; j = x2.f(); x1.c = ‘#’; k = p -> f();
…
}
Объекты класса можно определять совместно с описанием класса:
class Y {…} y1, y2;
Классы и структуры С++
Синтаксис класса в С++ совпадает с синтаксисом структуры С++: struct Имя_структуры { определение_членов_структуры };
Класс С++ отличается от структуры С++ только определением по умолча-нию первой области доступа в их описании (а также определением по умолчанию способа наследования, см. раздел 10.3):
для структур умолчанием является открытый доступ (public)
для классов умолчанием является закрытый доступ (private).
Различия в умолчаниях связаны с различиями целей создания таких конст-рукций. Структуры создавались для объединения и совместного использования разнородных типов данных, например записей файлов. Класс предназначен для определения полноценного типа данных.
В C++ объекты можно создавать также на основе структур и объединений
(union).
Структуру можно рассматривать как прообраз понятия класс. Изначально концепция структуры (например, в Си) служила исключительно объединению разнородных данных в единой конструкции для совместной обработки, то есть в понятии структуры присутствовала исключительно информационная состав-ляющая. В С ++ время в структуре могут быть и функции-члены, в том числе и специальные члены – конструкторы и деструкторы, о которых будет рассказано в следующих разделах. Структуры наравне с классами можно использовать для полноценного описания типов данных, включающего описания операций, при-меняемых к описываемому типу данных. Однако наличие информационных членов в открытой секции нарушает один из основных принципов ООП – прин-
цип инкапсуляции.
