Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

gos_янв_2009 / 2.5. ООП

.doc
Скачиваний:
251
Добавлен:
22.06.2014
Размер:
162.3 Кб
Скачать

1. ООП - Раннее связывание и позднее связывание.

Тип может связываться с программным объектом статически (тип объекта определен на этапе компиляции − раннее связывание) и динамически (тип объекта определяется только во время выполнения программы − позднее связывание).

Позднее связывание (Late binding) - ситуация, при которой адрес вызываемого метода неизвестен до момента выполнения программы. Адресация разрешается путем использования таблиц виртуальных методов с адресами методов.

Раннее связывание (Early binding) - ситуация, при которой адрес вызываемого метода известен в момент компиляции / компоновки.

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

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

Полиморфизм - исключительно мощный метод обобщения однотипных задач для многих разных объектов. Он повышает степень абстрагирования при создании программного обеспечения. Возможен же полиморфизм благодаря позднему связыванию.

3. ООП - Определение объектно-ориентированного подхода.

Объектно-ориентированный подход основан на использовании моделей для языково-независимой разработки программной системы, на основе замены объектов реального мира их моделями.

Основные идеи объектно-ориентированного подхода опираются на следующие положения:

- Программа представляет собой модель некоторого реального процесса, части реального мира.

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

- Объект описывается набором параметров, значения которых определяют состояние объекта, и набором операций (действий), которые может выполнять объект.

- Взаимодействие между объектами осуществляется посылкой специальных сообщений от одного объекта к другому. Сообщение, полученное объектом, может потребовать выполнения определенных действий, например, изменения состояния объекта.

- Объекты, описанные одним и тем же набором параметров и способные выполнять один и тот же набор действий, представляют собой класс однотипных объектов.

Объектно-ориентированный подход помогает добиться:

- уменьшения сложности программного обеспечения;

- повышения надежности программного обеспечения;

- обеспечения возможности модификации отдельных компонентов программного обеспечения без изменения остальных его компонентов;

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

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

20. ООП - Объектная декомпозиция.

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

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

Совокупность значений параметров объекта называют его состоянием, а совокупность реакций на получаемые сообщения — поведением.

Параметры состояния и элементы поведения объектов определяются условием задачи.

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

Таким образом, при выполнении объектной декомпозиции определяют и описывают множество объектов предметной области и множество сообщений, которое формирует и получает каждый объект.

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

- Объектная декомпозиция позволяет избежать создания сложных моделей, так как она предполагает эволюционный путь развития модели на базе относительно небольших подсистем.

- Объектная модель естественна, поскольку ориентированна на человеческое восприятие мира.

4. ООП - Конструктор и деструктор.

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

Конструктор не возвращает никакое значение, и при описании конструктора не используется ключевое слово void. Функцией, обратной конструктору, является деструктор. Деструктор – специальная процедура для освобождения памяти, занятой объектом. Эта функция обычно вызывается при удалении объекта. Например, если при создании объекта для него динамически выделялась память, то при удалении объекта ее нужно освободить. Локальные объекты удаляются тогда, когда они выходят из области видимости. Глобальные объекты удаляются при завершении программы.

Конструктор используется для инициализации переменных класса и для выделения памяти под динамические массивы. Он выполняется автоматически при создании представителя класса. Конструктор имеет имя, совпадающее с именем класса. Тип возвращаемого результата для конструктора не указывается. Одновременно может быть определено несколько конструкторов, которые отличаются количеством и типом аргументов. Имеется как минимум три конструктора:

  • конструктор без параметров (используемый по умолчанию),

  • конструктор с параметрами,

  • конструктор, создающий копию объекта.

Если они не включены в описание класса, то компилятор создает их самостоятельно.

Деструктор вызывается при уничтожении объекта. Он обычно используется для освобождения памяти. Деструктор имеет имя, совпадающее с именем класса, но впереди имени ставится знак ‘~’ (тильда), параметров не имеет.

5. ООП - Объектная модель программной системы.

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

Обычно класс объектов в объектной модели представляется в виде тройки

(Имя класса,

Список атрибутов,

Список операций).

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

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

5. ООП - Объектная модель программной системы. Продолжение

Различают следующие виды ассоциаций:

  • взаимодействия состояний объектов,

  • агрегирования (структурирования) объектов,

  • абстрагирования (порождения) классов.

Ассоциация «взаимодействие», по существу, означает, что объекты классов, находящихся в таком отношении, могут быть параметрами некоторых операций. Ассоциация «агрегирование» означает, что объект одного из классов, находящихся в таком отношении, включает (или может включать) в себя (как часть) объекты другого из этих классов. Ассоциация «абстрагирование» означает, что один из классов, находящихся в таком отношении, наследует свойства другого из этих классов и может обладать также и другими (дополнительными) свойствами.

6. ООП - Инкапсуляция.

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

B C++ программисту предоставлено три уровня доступа к элементам объектов:

- public (общий),

- private (приватный),

- protected (защищенный).

Элементы, объявленные общими, будут доступны любому внешнему элементу класса, любой функции элементу или выражению в программе, когда объект является видимым.

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

К защищенным элементам имеют доступ лишь некоторые из объектов. Они доступны только элементам своего класса и любым его потомкам. Поэтому защищенные элементы занимают промежуточное положение между общими и приватными.

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

7. ООП - Правила доступности членов класса в С++.

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

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

В С++ существует три служебных слова, определяющих доступ членов класса. public – после этого слова двоеточие означает, что все нижеследующие члены класса будут считаться общедоступными, пока не встретиться другое описание доступности.

Другое слово protected определяет, что члены класса доступны только дружественным функциям и классам, а также классам – наследникам данного класса.

Слово private ограничивает круг “посвященных “ только дружественными функциями и классами.

Дружественные функции и классы - это функции и классы, упомянутые внутри описания класса с описателем friend. Это слово ставиться самым первым в описании такой функции или класса.

8. ООП - Агрегация, связь правил объектной модели и правил объектно-ориентированного программирования.

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

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

В качестве примера отношения агрегирования между классами объектов можно привести: отношение «программа состоит из одного или нескольких модулей» представлено на рис.

Для реализации нестрогой агрегации часть включается в целое по ссылке: на языке С++ это обычно указатель на соответствующий класс. Таким образом, если этот указатель равен нулю, то компонент отсутствует. В зависимости от решаемой задачи такой компонент может появляться и исчезать динамически в течение жизни объекта целое.

Строгая агрегация имеет специальное название – композиция. Она означает, что компонент не может исчезнуть, пока объект целое существует. На диаграмме отношение композиции обозначается линией со стрелкой в виде незакрашенного ромба.

9. ООП - Наследование.

В ООП существует возможность конструирования новых более сложных классов из уже имеющихся посредством добавления полей и определения новых методов (принцип иерархичности). При этом исходный класс, на базе которого выполняется конструирование, часто называется родителем, а производный − потомком. Специальный механизм наследования обеспечивает классу-потомку возможность использования полей и методов одного или нескольких родительских классов.

Если непосредственный родитель единственный, то наследование называется простым, а если таких классов несколько – то множественным. При этом класс-родитель (или классы родители) и класс-потомок образуют иерархию:

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

Наследование процесс получения данных и методов от объекта-предка или нескольких объектов-предков (соответственно простое и множественное наследование).

Рассмотрим пример – наследование, класс Окно_меняющее_цвет. Построим на базе класса Окно класс-потомок, который может изменять цвет окна на экране. Для этого к родительскому классу достаточно добавить метод Изменить_цвет:

Класс Окно_меняющее_цвет − родитель: класс Окно:

метод Изменить_цвет(аСо1ог);

Конец описания.

Класс Окно_меняющее_цвет содержит все поля родительского класса и все его методы. При множественном наследовании, реализованном, например, в C++, наследуются поля и методы всех родителей. В том случае, если среди родителей есть классы, принадлежащие одной иерархии, происходит дублирование полей и методов, наследуемых от общих родителей. Для того чтобы избежать неоднозначности, в C++ введено понятие виртуального наследования, при использовании которого виртуально наследуемые поля и методы не дублируются.

10. ООП - Виртуальные методы.

Проблема доступа к методам, переопределенным в производных классах, через указатель на базовый класс решается в С++ посредством использования виртуальных методов. Чтобы сделать некоторый метод виртуальным, надо в базовом классе предварить его заголовок спецификатором virtual. После этого он будет восприниматься как виртуальный во всех производных классах иерархии.

По отношению ко всем виртуальным методам компилятор применяет стратегию позднего, или динамического, связывания. Это означает, что на этапе компиляции он не определяет, какой из методов должен быть вызван, а передает ответственность программе, которая принимает решение на этапе выполнения, когда уже точно известно, каков тип объекта, на который указывает наш указатель. Это относится также к вызову методов по ссылке на базовый класс.

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

Виртуальный механизм работает только при использовании указателей и ссылок на объекты. Объект, определенный через указатель или ссылку и содержащий виртуальные методы, называется полиморфным.

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

11. ООП - Класс и структура.

Структура позволяет иметь смешанные атрибуты различных типов данных. Структура создается при помощи ключевого слова struct, за которым следует имя_типа (имя структуры) и список элементов. Описание структуры заканчивается точкой с запятой, т.к. оно является оператором:

struct имя_типа

{

тип_элемента1 имя_элемента1;

тип_элемента2 имя_элемента2;

тип_элемента3 имя_элемента3;

};

Для обращения к отдельным элементам структуры используется операция обращения к члену структуры – “точка”. Она разделяет имя структурной переменной и имя поля, например used_data.year=1970;

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

11. ООП - Класс и структура. Продолжение 1

Ключевым понятием С++ является класс. Класс − это структурный тип данных, который включает описание полей данных, а также процедур и функций, работающих с этими полями данных.

Описание класса С++ начинается с ключевого слова class. Оформление определения класса очень похоже на описание struct.

class имя_класса

{

тип переменная1;

тип переменная2;

функция-член1

функция-член2

public:

тип переменная3;

тип переменная4;

функция-член3

функция-член4

};

В самом простом виде класс определяется в С++ как структура, работа с элементами которой возможна только через элементы функции. По умолчанию члены класса являются частными (private). Они доступны только функциям-членам. После объявления public следуют данные и функции, доступные внешним для класса функциям. Внутри описания класса может быть указан только прототип метода.

«Приватная» часть не обязательно должна следовать в начале определения класса. Для ее обозначения в произвольном месте определения класса можно использовать служебное слово private.

11. ООП - Класс и структура. Продолжение 2

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

Члены класса – это переменные состояния и методы этого класса, иными словами, членами класса могут быть как переменные, так и функции. Функции и переменные, объявленные внутри объявления класса, становятся членами этого класса. Функции-члены класса будем называть методами этого класса.

По умолчанию все функции и переменные, объявленные в классе, становятся закрытыми (private). Т.е. они доступны только из других членов этого класса. Для объявления открытых членов класса используется ключевое слово public. Все функции-методы и переменные, объявленные после слова public, доступны и для других членов класса, и для любой другой части программы, в которой содержится класс. В структурах по умолчанию все члены являются отрытыми. Так что, приведенные ниже примеры аналогичны.

12. ООП - Полиморфизм.

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

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

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

Чистый полиморфизм − используется для обозначения того, что один код функции может по-разному интерпретироваться в зависимости от типа аргументов; используется в языках высокого уровня абстракции, например в языке LISP или SMALLTALK.

Перегрузка (полиморфные имена функций) − используется, когда определяется несколько функций с одним именем − одно и то же имя функции может многократно использоваться в разных местах программы; выбор нужной функции может определяться типами аргументов, областью видимости (внутри модуля, файла, класса и т.д.).

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

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

Обобщенные функции или шаблоны − используются в ООП при реализации в языке параметризованных классов (например, в C++), параметрами такого класса являются типы аргументов методов класса

Р ассмотрим простой полиморфизм на примере − класс Окно_с_текстом. Пусть необходимо разработать на базе класса Окно класс Окно_с_текстом. Для этого к полям класса Окно необходимо добавить специальные поля для определения координат первой буквы текста − Xt, Yt и поле, содержащее сам текст − Text. Кроме этого, понадобится специальный метод, который будет обрабатывать сообщение «Нарисовать». Однако у нас уже существует родительский метод Изобразить, который обрабатывает это сообщение. Следовательно, необходимо заменить родительский метод методом потомка.

Механизм полиморфизма позволяет для класса-потомка Окно_с_текстом предусмотреть собственный метод Изобразить (см. рис. 18). Метод Инициализировать также должен быть переопределен, так как он должен инициализировать дополнительные поля класса.

Класс Окно_с_текстом - родитель: класс Окно:

поля Xt, Yt, Text

метод Инициализировать (aXl,aYl,aX2,aY2,aColor,

aXt, aYt, aText)

метод Изобразить

Конец описания.

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

13. ООП - Указатели.

Указатель – это адрес объекта в памяти. Переменная типа «указатель» - это специально объявленная переменная, в которой храниться указатель на переменную определенного типа. Если переменная является указателем, то в объявлении перед ее именем нужно поставить символ *, она сообщит компилятору о том, что это указатель на переменную данного типа. Эта операция называется разыменовыванием указателя, она корректно выполняется только, если указатель был предварительно инициализирован:

int i=100;// определяется целая переменная

int *point_i;// определяется указатель на целую переменную

pointi=&i; // указатель инициализируется адресом переменной i

printf(“%i”,*pointi); // выводится значение переменной, определяемое указателем. Оно равно

// значению переменной i (100).

Операция определения адреса (&) является противоположной разыменованию.

В общем случае описание указателя имеет вид: тип_указываемых данных *имя_указателя;.

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

Указатели должны инициализироваться либо при своем объявлении, либо в операторе присваивания. Переменная, объявленная как указатель, хранит адрес памяти и информацию о типе объекта, на который ссылается указатель.

int array[10];

int *iptr=array;

13. ООП - Указатели. Продолжение

С указателями можно выполнять целочисленные арифметические операции. При этом происходит вычисление адреса соответствующего элемента массива, а не адреса в памяти компьютера. Размер элемента определяется типом указателя. Для типа void соответственно никакие операции выполнять нельзя.

Указатель можно индексировать как массив. Следующие два оператора эквивалентны:

array[3]=10;

*(array+3)=10;

Указатели вместо массивов целесообразно использовать тогда, когда требуется последовательный доступ к элементам массива. Такая операция выполняется значительно быстрее, например:

int *ptemp=array;

for(int i=1;i<10;i++)

*(ptemp++)=0;

можно использовать для обнуления массива array.

14. ООП - Перегрузка функций.

Цель перегрузки состоит в том, чтобы функция с одним именем по-разному выполнялась и возвращала всевозможные значения при обращении к ней с различными списками фактических параметров. Выбор нужной функции зависит от списка параметров. Для обеспечения перегрузки функций необходимо для каждого имени определить, какие комбинации параметров возможны при обращении к ним. Перегруженные функции должны иметь одинаковые имена, но отличаться по количеству параметров, их типам или расположению.

Ниже показан пример объявления перегруженной функции с именем total(), принимающей в качестве аргументов массивы чисел типа int, float и double.

int total (initisize, int iarray[]);

float total (initisize, float farray[]);

double total (initiasize, double darray[]);

15. ООП - Шаблоны функций и классов.

Шаблоны дают возможность определять при помощи одного фрагмента кода целый набор взаимосвязанных функций (перегруженных), называемых шаблонными функциями, или набор связанных классов, называемых шаблонными классами.

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

Шаблоны-функции могут использоваться для определения параметризированных алгоритмов. Основное отличие шаблона-функции от шаблона-класса в том, что не нужно сообщать компилятору, к каким типам параметров применяется функция, он сам может определить это по типам ее формальных параметров. Описание шаблонов-функций начинаются с ключевого слова template, за которым следует список формальных параметров шаблона, заключаемый в угловые скобки. (< и >); каждому формальному параметру должно предшествовать ключевое слово class или typename, например: Template < class T> или Template < typename T>

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

16. ООП - Указатель this.

При описании класса автоматически объявляется переменная с именем this. Она указывает на текущий экземпляр класса:

ИмяКласса *this;

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

Каждый объект имеет доступ к собственному адресу с помощью указателя this. Указатель this объекта не является частью самого объекта – то есть указатель this не отражается в результате операции sizeof над этим объектом. Скорее, указатель this передается в объект (компилятором) как неявный первый аргумент в каждом вызове нестатической функции-члена для объекта.

Указатель this неявно используется для ссылки как на данные-члены, так и на функции-члены объекта. Тип указателя this зависит от типа объекта и от того объявлена ли функция-член, в которой используется this, как const. В неконстантной функции-члене класса Х указатель this имеет тип X *const (константный указатель на объект Х). В константной функции-члене класса Х указатель this имеет тип const X *const (константный указатель на объект Х, который тоже константный).

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

17. ООП - Локальные классы.

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

Объемлющая функция не имеет особых прав доступа к членам локального класса, она подчиняется обычным правилам доступа.

Функцию-член локального класса следует определять в определении этого класса. Локальный класс не может иметь статических членов, представляющих данные.

void m() {

static int s;

int x;

struct local {

void m1() { x; } // ошибка: х – динамическая переменная

void m2() { s; } // верно

};

18. ООП - Абстрактные классы.

Суперкласс, в котором заданы только атрибуты и сигнатуры операций. Но не определены методы, реализующие его операции, называется абстрактным классом. Абстрактный класс не может иметь объектов, т.к. в нем не определены операции над объектами; объекты должны принадлежать конкретным подклассам абстрактного класса. Классы, для которых нет смысла создавать объекты, объявляют как абстрактные. Абстрактный класс – это класс, содержащий хотя бы один чисто виртуальный метод. Чисто виртуальный метод – это метод, объявленный в классе, но не имеющий конкретной реализации. Синтаксис объявления чисто виртуального метода дополняется конструкцией = 0, например: virtual void Show() = 0;

Единственным назначением абстрактного класса является создание соответствующего базового класса, от которого другие классы могут наследовать интерфейс и реализацию. Классы, объекты которых могут быть реализованы, называются конкретными классами.

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

Абстрактный класс нельзя употреблять в качестве типа параметра функции, типа возвращаемого функцией значения или как тип при явном приведении.

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

19. ООП - Друзья классов.

Дружественные функции (friend-функции) класса определяются вне области действия класса, но имеют доступ к закрытым членам private и protected данного класса. Функция или класс, в целом, могут быть объявлены другом friend другого класса. Таким образом, дружественные функции, не являясь членами класса, получают доступ к описанным в нем переменным и методам.

Чтобы объявить функцию как друга класса, перед ее прототипом в описании класса ставиться ключевое слово friend.

Class type {

Private:

Int prm;

Public:

Friend void ftype (type x, int y);

Void ftype(type x, int y);

{x.prm=y;}

В примере в «дружественной» классу функции ftype осуществляется доступ к внутренней переменной prm объекта х, принадлежащего к классу type.

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

2. ООП - Объектно-ориентированная разработка программ.

Объектно-ориентированная разработка программного обеспечения связана с применением объектно-ориентированных моделей при разработке программных систем и их компонентов. Под объектно-ориентированной разработкой имеются в виду: объектно-ориентированные методологии (технологии) разработки программных систем; инструментальные средства, поддерживающие эти технологии.

Процесс разработки программного обеспечения с использованием ООП включает четыре этапа:

  1. анализ;

  2. проектирование;

  3. эволюция;

  4. модификация.

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

Проектирование. Различают:

- логическое проектирование, при котором принимаемые решения практически не зависят от условий эксплуатации (операционной системы и используемого оборудования);

- физическое проектирование, при котором приходится принимать во внимание указанные факторы.

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

2. ООП - Объектно-ориентированная разработка программ. Продолжение

Физическое проектирование включает объединение описаний классов в модули, выбор схемы их подключения (статическая или динамическая компоновка), определение способов взаимодействия с оборудованием, с операционной системой и/или другим программным обеспечением (например, базами данных, сетевыми программами), обеспечение синхронизации процессов для систем параллельной обработки и т.д.

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

Например, таким прототипом может служить система, включающая реализацию основного интерфейса программного продукта (передача сообщений в отсутствующую пока часть системы не выполняется). В результате мы получаем работоспособный прототип продукта, который может быть, например, показан заказчику для уточнения требований. Затем к системе подключается следующая группа классов, например, связанная с реализацией некоторого пункта меню. Полученный вариант также тестируется и отлаживается и так далее, до реализации всех возможностей системы.

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

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

Обычно проектирование начинается, когда какой-либо фрагмент предметной области достаточно полно описан в процессе анализа.

Соседние файлы в папке gos_янв_2009