
- •Класс и атд
- •Классификация методов
- •Действия над объектами
- •Способы задания доступа
- •Область видимости класса
- •Указатель this
- •Функции-члены типа static и const
- •Перегрузка операторов
- •Доступные и недоступные для перегрузки операторы:
- •Перегрузка обычными функция, как компонентными
- •Примеры перегрузки операторов:
- •56. Параметрический полиморфизм: шаблонные классы и шаблонные функции - назначение, параметризованные типы данных, синтаксис и семантика.
51. Основные идеи и сущность ООП: использование объекта в качестве основной компоненты программы и децентрализация управления, реализуемая представлением программы совокупностью взаимодействующих объектов, моделирование поведения объектов реального мира, наглядное представление объектов, создание и использование АТД, производные АТД.
ООП — это стиль программирования, который фиксирует поведение реального мира так, что детали разработки скрыты, а это позволяет тому, кто решает задачу, мыслить в терминах, присущих этой задаче, а не программированию.
ООП — это программирование, сфокусированное на данных, причем данные и поведение неразрывно связаны. Вместе данные и поведение представляют собой класс, а объекты являются экземплярами класса. ООП рассматривает вычисления как моделирование поведения. То, что моделируется, является объектами, представленными вычислительной абстракцией.
Программы - это совокупность взаимодействующих объектов. Каждый объект отвечает за конкретную задачу. Вычисление осуществляется посредством взаимодействия объектов. Объект получается в результате инкапсуляции состояния (данных) и поведения (операций). Поведение объекта диктуется классом. Данные и поведение представлены в виде классов, экземпляры которых - объекты. Все экземпляры одного класса будут вести себя одинаковым образом в ответ на одинаковые запросы.
Для удобства создания нового типа из уже существующих типов, определенных пользователем используется механизм наследования. Классы могут быть организованы в виде иерархического дерева наследования. С помощью уменьшения взаимозависимости ООП позволяет разрабатывать системы, пригодные для многократного использования. ООП - это взгляд на программирование, сосредоточенный на данных, в котором данные и поведение жестко связаны. Для этого необходимо, чтобы объекты определялись вместе с сообщениями, на которые они могут реагировать.
Принципы ООП:
Абстракция - расширяемость типов - способность добавлять типы, определяемые пользователем для того, чтобы дополнить ими встроенные типы. Один из принципов ООП заключается в том, чтобы типы, определяемые пользователем, должны обладать теми же привилегиями, что и встроенные типы;
Инкапсуляция - свойство языка программирования, позволяющее пользователю не задумываться о сложности реализации используемого программного компонента, а взаимодействовать с ним посредством предоставляемого интерфейса, а также объединить и защитить жизненно важные для компонента данные. При этом пользователю предоставляется только интерфейс — спецификация объекта.
Наследование. Классы могут быть организованы в иерархическую структуру с наследованием свойств. Дочерний класс наследует атрибуты родительского класса.
Полиморфизм. Объекты реагируют на одно и тоже сообщение строго специфичным для них образом.
Центральным элементом ООП является инкапсуляция совокупности данных и соответствующих им операций. Понятие класса с его функциями-членами и членами данных предоставляет программисту подходящий для реализации инкапсуляции инструмент. Переменные класса являются объектами, которыми можно управлять.
Кроме того, классы обеспечивают сокрытие данных. Права доступа могут устанавливаться или ограничиваться для любой группы функций, которым необходим доступ к деталям реализации. Тем самым обеспечивается модульность и надежность.
Еще одной важной концепцией ООП является поощрение повторного использования кода с помощью механизма наследования. Суть этого механизма — получение нового производного класса из существующего, называемого базовым. При создания производного класса базовый класс может быть дополнен или изменен. Таким путем могут создаваться иерархии родственных типов данных, которые используют общий код.
ООП зачастую более сложно, чем обычное процедурное программирование, как оно выглядит на С. Существует по крайней мере один дополнительный шаг на этапе проектирования, перед алгоритмизацией и кодированием. Он состоит в разработке таких типов данных, которые соответствовали бы поставленной проблеме. Зачастую проблема решается «обобщеннее», чем это действительно необходимо.
Есть уверенность, что использование ООП принесет дивиденды в нескольких отношениях. Решение будет более модульным, следовательно, более понятным и простым для модификации и обслуживания. Кроме того, такое решение будет более пригодно для повторного использования. Например, если в программе нужен стек, то он легко заимствуется из существующего кода. В обычном процедурном языке программирования такие структуры данных часто «вмонтированы» в алгоритм и не могут экспортироваться.
Абстрактный тип данных – определяемые пользователем расширения исходных типов языка. АТД состоит из набора значений и операций, которые могут влиять на эти значения. Значения описываются полями класса, а операции – методами.
52. Основные концепции ООП: инкапсуляция и расширяемость типов, семантика объекта - данные как отражение состояния объекта и методы как средства обеспечения взаимодействия объектов; представление данных, классификация методов - конструкторы, деструкторы, селекторы, модификаторы; классы и абстрактные типы данных, наглядное представление классов, объекты как экземпляры классов, основные действия с объектами - создание, инициализация, обработка, разрушение.
Свойства ООП:.
Моделирование действий из реального мира;
Инкапсуляция - способность отличать внутреннее состояние объекта и поведение от его внешнего состояния и поведения;
Абстракция (расширяемость типов) способность добавлять типы, определяемые пользователем для того, чтобы дополнить ими встроенные типы. (типы, определяемые пользователем, должны обладать теми же привилегиями, что и встроенные типы);
Наследование - способность создавать новые типы, повторно исп-я, описание существующих типов;
Полиморфизм с динамическим связыванием - способность объектов быть ответственными за интерпретацию вызова функции.
ООП — это сбалансированный подход к написанию программного обеспечения. Данные и поведение упакованы вместе. Такая инкапсуляция создает определяемые пользователем типы данных, расширяющие собственные типы языка и взаимодействующие с ними. Расширяемость типов — это возможность добавлять к языку определяемые пользователем типы данных, которые так же легко использовать, как и собственные типы.
Класс состоит из данных и методов, работающих с данными. Объект является конкретным экземпляром класса. Доступ к членам объекта (переменным и методам) осуществляется с помощью оператора (.), размещаемого между именем объекта и именем переменной.
Класс и атд
Класс - это абстрактный тип данных, снабженный некоторой (возможно частичной) реализацией. Таким образом, чтобы получить класс, мы должны построить АТД и решить, как его реализовывать. АТД - это математическое понятие, а реализация - это его версия, ориентированная на компьютер.
АТД, например строка, является описанием идеального, всем известного поведения типа. Пользователь строки знает, что операции, такие как конкатенация или печать, имеют определенное поведение. Операции конкатенации и печати называются методами. Конкретная реализация АТД может иметь ограничения; например, строки могут быть ограничены по длине. Эти ограничения влияют на открытое всем поведение. В то же время, внутренние или закрытые детали реализации не влияют прямо на то, как пользователь видит объект.
В C++ для обеспечения инкапсуляции используются объявления класса и структуры (class и struct) в сочетании с ключевыми словами доступа private (закрытый), protected (защищенный) и public (открытый).
Классификация методов
Конструктор - функция-член, единственная работа которой заключается в инициализации объекта класса. Конструкторы вызываются всякий раз, когда создается объект данного класса.
Конструкторы часто перегружают, задавая несколько функций-конструкторов, чтобы предоставить несколько способов инициализации объекта.
Деструктор — это функция-член, задача которой состоит в том, чтобы завершить существование переменной класса. Этот процесс часто предполагает динамическое освобождение памяти.
Модификатор - изменяет состояние объекта.
Селектор - дает доступ к состоянию, но не изменяет его.
Действия над объектами
Создание
Инициализация
Обработка
Разрушение
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), потому что все должны знать об открытом интерфейсе, но только поставщику класса необходимы сведения о закрытых деталях его реализации.