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

51. Основные идеи и сущность ООП: использование объекта в качестве основной компоненты программы и децентрализация управления, реализуемая представлением программы совокупностью взаимодействующих объектов, моделирование поведения объектов реального мира, наглядное представление объектов, создание и использование АТД, производные АТД.

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

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

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

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

Принципы ООП:

  1. Абстракция - расширяемость типов - способность добавлять типы, определяемые пользователем для того, чтобы дополнить ими встроенные типы. Один из принципов ООП заключается в том, чтобы типы, определяемые пользователем, должны обладать теми же привилегиями, что и встроенные типы;

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

  3. Наследование. Классы могут быть организованы в иерархическую структуру с наследованием свойств. Дочерний класс наследует атрибуты родительского класса.

  4. Полиморфизм. Объекты реагируют на одно и тоже сообщение строго специфичным для них образом.

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

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

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

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

Есть уверенность, что использование ООП принесет дивиденды в нескольких от­ношениях. Решение будет более модульным, следовательно, более понятным и про­стым для модификации и обслуживания. Кроме того, такое решение будет более при­годно для повторного использования. Например, если в программе нужен стек, то он легко заимствуется из существующего кода. В обычном процедурном языке програм­мирования такие структуры данных часто «вмонтированы» в алгоритм и не могут экспортироваться.

Абстрактный тип данных – определяемые пользователем расширения исходных типов языка. АТД состоит из набора значений и операций, которые могут влиять на эти значения. Значения описываются полями класса, а операции – методами.

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

Свойства ООП:.

  1. Моделирование действий из реального мира;

  2. Инкапсуляция - способность отличать внутреннее состояние объекта и поведение от его внешнего состояния и поведения;

  3. Абстракция (расширяемость типов) способность добавлять типы, определяемые пользователем для того, чтобы дополнить ими встроенные типы. (типы, определяемые пользователем, должны обладать теми же привилегиями, что и встроенные типы);

  4. Наследование - способность создавать новые типы, повторно исп-я, описание существующих типов;

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

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

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

Класс и атд

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

АТД, например строка, является описанием идеального, всем известного поведения типа. Пользователь строки знает, что операции, такие как кон­катенация или печать, имеют определенное поведение. Операции конкатенации и печати называются методами. Конкретная реализация АТД может иметь ограниче­ния; например, строки могут быть ограничены по длине. Эти ограничения влияют на открытое всем поведение. В то же время, внутренние или закрытые детали реализа­ции не влияют прямо на то, как пользователь видит объект.

В C++ для обеспе­чения инкапсуляции используются объявления класса и структуры (class и struct) в сочетании с ключевыми словами доступа private (закрытый), protected (защищенный) и public (открытый).

Классификация методов

Конст­руктор - функция-член, единствен­ная работа которой заключается в инициализации объекта класса. Конструкторы вызываются всякий раз, когда создается объект данного класса.

Конструкторы часто перегружают, задавая несколько функций-конструкторов, что­бы предоставить несколько способов инициализации объекта.

Деструктор — это фун­кция-член, задача которой состоит в том, чтобы завершить существование переменной класса. Этот процесс часто предполагает динамическое освобождение памяти.

Модификатор - изменяет состояние объекта.

Селектор - дает доступ к состоянию, но не изменяет его.

Действия над объектами

  1. Создание

  2. Инициализация

  3. Обработка

  4. Разрушение

53. Классы: компонентные данные, компонентные функции, способы задания доступа, синтаксическая структура определения класса, объявление, определение и инициализация объектов, объекты объявленные как константы, область видимости класса, указатель this, компонентные функции типа static и const (статические и постоянные компонентные функции), тестирование класса.

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

Способы задания доступа

В C++ классы вводятся ключевым словом class. Они являются формой структуры, права доступа к членам которой по умолчанию определены как закрытые (private). Таким образом, srtuct и class взаимозаменяемы, но необходимо определять надлежащие права доступа.

Давайте перепишем пример с комплексными числами:

struct complex { public:

r. double i]

void assign (double);

void print(){cout << real << " + " << imag « "i " ; } }

private:

double real, imag;};

inline void complex::assign(double r, double i = 0.0){real = r; imag = i;}

А вот эквивалентное представление класса:

В файле complex2.cpp

class complex {

public://стиль «должен знать»

void assign (double r, double i); //см. ниже

void print() { cout << real << " + " << imag « "i ";}

private:

double real, imag;

inline void complex::assign(double r, double i = 0.0) {real = r;imag = i;}

Также возможно было бы:

class complex {

double real, imag;

public:

void assign (double r, double i);

void print(){ cout << real << " + " << imag « "i ";}

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

Здесь используется тот факт, что по умолчанию доступ к членам класса является закрытым. Мы также будем явно использовать ключевые слова доступа и в тексте программы сперва располагать открытые члены, а затем — закрытые. Мы называем такой стиль «должен знать» («need-to-know» style), потому что все должны знать об открытом интерфейсе, но только поставщику класса необходимы сведения о закрытых деталях его реализации.

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