ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 08.11.2023

Просмотров: 136

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Переопределение операций

Можно сформулировать следующее правило:

• Если оператор изменяет значение своего аргумента, возвращайте аргумент по ссылке.

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

• Входные аргументы лучше всегда передавать по ссылке.

Недостатки структур. Проблемы структурного программирования

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

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

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

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

Моделирование реального мира Расположение отдельных данных и функций плохо моделирует вещи в реальном мире. Сложные реальные объекты обладают атрибутами и поведением.

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

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

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

Абстрактный тип данных — это совокупность данных вместе с множеством операций, которые можно выполнять над этими данными.

По определению Гради Буча (Grady Booch) «объектно-ориентированное программирование (ООП) – это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию на принципах наследуемости.

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

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

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

С объектом связывается набор действий, иначе называемых методами.

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

Объект – это структурированная переменная, содержащая всю информацию о некотором физическом предмете или реализуемом в программе понятии.

Класс – это описание множества объектов программирования (объектов) и выполняемых над ними действий.

Методы класса — это его функции.

Свойства класса — его переменные.

Интерфейс – это набор методов класса, доступных для использования другими классами

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

Основными понятиями ООП являются

инкапсуляция; наследование; полиморфизм.

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

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

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

Класс – это объект («новый тип данных»)

ключевое_слово [] { } «ключевое_слово»

class – все члены являются закрытыми (private)

struct - все члены являются общедоступными

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

Данные-члены класса объявляются так же, как переменные.

Член класса может иметь любой тип. class A { int a, b; double *x, y; };

Описанные данные-члены называются нестатическими.

Класс может иметь также и статические данные члены.

Функции-члены

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

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

Функции-члены отличаются от обычных функций следующим:

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

К функции-члену можно обратиться с помощью одного из операторов доступа к членам – точки (.) или стрелки (->) (для указателя)

Функции-члены имеют право доступа как к открытым, так и к закрытым членам класса, тогда как обычным функциям доступны лишь открытые члены

Функция-член может быть перегруженной. Однако она способна перегружать лишь другую функцию-член своего класса.

Доступ к членам.

Сокрытие информации – это формальный механизм, предотвращающий прямой доступ к внутреннему представлению типа класса из функций программы. Ограничение доступа к членам задается с помощью секций тела класса, помеченных ключевыми словами public, private и protected – спецификаторами доступа.

Существует три уровня:

public – общедоступные члены. Могут использоваться в любом месте. Обычно это функции.

private - личные или закрытые члены, которые могут использоваться в функциях членах данного класса и в функциях друзьях (friend).

protected - защищенные члены аналогичны закрытым, но могут использоваться также функциями-членами классов, которые порождены из данного класса. Могут влиять на реализацию производных классов. (для наследования)

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

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

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

Встроенные функции Вызов функции происходит медленнее, чем непосредственное вычисление операторов. Необходимо скопировать аргументы, запомнить содержимое регистров и передать управление в другое место программы. Решение дают встроенные функции. Встроенная функция “подставляется по месту” в каждой точке своего вызова. Функция объявляется как встроенная с помощью ключевого слова inline перед типом возвращаемого значения в объявлении или определении:

Функции-члены можно объявить в теле класса встроенными и явно, поместив перед типом возвращаемого значения ключевое слово inline

inline void in(int x, int y) { a = x; b = y; return; }

закрытые и открытые функции-члены Функцию-член можно объявить в любой из секций public, private или protected тела класса. Открытая функция-член задает операцию, которая может понадобиться пользователю. Множество открытых функций-членов составляет интерфейс класса.

Специальные функции-члены

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

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

При создании новых объектов каждый раз вызывается конструктор. Конструктор – это функция-член, имя которой совпадает с именем класса объектов.

Функция член не имеет типа.

Конструкторов может быть несколько. Они отличаются по количеству и типу параметров.

Деструктор

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

Деструктор– это функция-член, имя которой совпадает с именем класса объектов, но всегда впереди стоит значок

(тильда).
Ключевое слово const помещается между списком параметров и телом функции-члена. Для константной функции-члена, определенной вне тела класса, это слово должно присутствовать как в объявлении, так и в определении (прототипе).VolatileКвалификатор volatile информирует компилятор что переменная может быть изменена не явным способом т.е. без явного использовать оператора присвоения.Указатель this Ключевое слово this представляет собой неявно определенный указатель на сам объект. С его помощью функция-член определяет, с данными какого объекта ей предстоит работать.Каждая функция-член класса неявно содержит в качестве член-данного указатель:ИмяКласса *this;При вызове член-функции ей передается неявный аргумент, содержащий адрес объекта, для которого эта функция вызывается.Использование this необходимо в функциях, которые непосредственно работают с указателем на объект: this – указатель на объект (адрес объекта) *this – разыменованый указатель (сам объект)Указатель this может быть использован только для нестатической функции-членСтатические члены класса Класс – это тип, а не объект данных, и в каждом объекте класса имеется своя собственная копия данных – членов этого класса.Статические данные относятся ко всем объектам класса.Статические члены описываются с помощью ключевого слова static, которое может использоваться при объявлении членданных и член-функций. Такие члены классов называются статическими, и независимо от количества объектов данного класса, существует только одна копия статического элементаСтатические члены класса нужны, чтобы все объекты некоторого класса имели доступ к единственному глобальному объекту.У статического члена есть следующие преимущества: статический член не находится в глобальном пространстве имен программы, следовательно, уменьшается вероятность случайного конфликта имен с другими глобальными объектами; остается возможность сокрытия информации, так как статический член может быть закрытым, а глобальный объект – всегда доступен.Чтобы сделать член статическим, надо поместить в начале его объявления в теле класса ключевое слово static. К ним применимы все правила доступа к открытым, закрытым и защищенным членам. Статический член инициализируется вне определения класса. Статический член класса доступен функции-члену того же класса и без использования соответствующих операторов.

Статической функции-члену указатель this не передаетсяДля перегрузки встроенных операторов используется ключевое слова operator.тип operator @ (список_параметров-операндов) { // ... тело функции ... } где @ — знак перегружаемой операции (-, +, * и т. д.), тип — тип возвращаемого значения.Имеется два способа описания функции, соответствующей переопределяемой операции: если функция задается как обычная функцияэлемент класса, то первым операндом операции является объект класса, указатель на который передается неявным параметром this; если первый операнд переопределяемой операции не является объектом некоторого класса, либо требуется передавать в качестве операнда не указатель, а сам объект (значение), то соответствующая функция должна быть определена как дружественная классу с полным списком аргументов.Операции, не допускающие перегрузки: . прямой выбор члена объекта класса; .* обращение к члену через указатель на него; ?: условная операция; :: операция указания области видимости; sizeof операция вычисления размера в байтах; # препроцессорная операция.Все остальные можно:)МяуПравила перегрузки операций Нельзя изменить синтаксис операции в выражении. Например, если некоторая операция определена как унарная, то ее нельзя определить как бинарную. Если для операции используется префиксная форма записи, то ее нельзя переопределить в постфиксную. Например, !а нельзя переопределить как а! Перегружать можно только операции, для которых хотя бы один аргумент представляет тип данных, определенный пользователем. Функция-операция должна быть определена либо как функция-член класса, либо как внешняя функция, но дружественная классуперегрузка бинарной операции Если бинарная операция перегружается с использованием функции-члена, то в качестве своего первого аргумента она получает неявно переданную переменную класса (указатель this на объект), а в качестве второго — аргумент из списка параметров. То есть, фактически, бинарная операция, перегружаемая функцией-членом, имеет один аргумент (правый операнд), а левый передается неявно через указатель this.Присваивание одного объекта другому объекту того же класса выполняется с помощью копирующего оператора присваивания. Для класса могут быть определены и другие операторы присваивания. Если объектам класса надо присваивать значения типа, отличного от этого класса, то разрешается определить такие операторы, принимающие подобные параметры. Например, чтобы поддержать присваивание Char-строки объекту String
Перегрузка унарной операции Если унарная операция перегружается как функция член, то она не должна иметь аргументов, так как в этом случае ей передается неявный аргумент указатель this на текущий объект. Если унарная операция перегружается дружественной функцией, то она должна иметь один аргумент – объект, для которого она выполняется.оператор взятия индекса Оператор взятия индекса operator [ ]() можно определять для классов, представляющих абстракцию контейнера, из которого извлекаются отдельные элементы. Примерами таких контейнеров могут служить класс String, класс массивов и т.п. Оператор взятия индекса может появляться как слева, так и справа от оператора присваивания. Чтобы быть в левой части, он должен возвращать lзначение индексируемого элемента. Поэтому функция должна возвращать ссылку.Также можно переопределить Оператор вызова функции Оператор "стрелка", разрешающий доступ к членам. Операторы new и deleteШаблоны классованалогично шаблонам функций определяется шаблон семейства классов: template ОпределениеКласса Шаблон семейства классов определяет способ построения отдельных классов подобно тому, как класс определяет правила построения и формат отдельных объектов. В определении класса, входящего в шаблон, особую роль играет имя класса. Оно является не именем отдельного класса, а параметризованным именем семейства классов.Формат определения объекта одного из классов, порождаемых шаблоном классов: ИмяПараметризованногоКласса<фактические параметры шаблона>ИмяОбъекта(ПараметрыКонструктора);Между типом аргумента шаблона и типом параметраконстанты допустимы некоторые преобразования. Их множество является подмножеством преобразований, допустимых для аргументов функции, например,: трансформации l-значений, включающие преобразование l-значения в r-значение, массива в указатель и функции в указатель преобразования квалификаторов расширения типов преобразования целых типовСТРУКТУРЫ ДАННЫХОсновные структуры данных - переменные, массивы, структуры, классы и т.д. Данные объекты имеют неизменяемую (статическую) структуру. Существуют задачи, в которых требуются данные с более сложной (динамической) структурой. Для такой структуры характерно, что в процессе вычислений изменяются не только значения объектов, но и структура хранения информации. Поэтому такие объекты называются динамическими информационными структурами. Их компоненты, в свою очередь, на некотором уровне детализации представляют собой объекты со статической структурой, то есть они принадлежат к одному из основных типов данных.
Связные списки Связный список является простейшим типом данных динамической структуры, состоящей из элементов (узлов). Каждый узел включает в себя в классическом варианте два поля: данные (в качестве данных может выступать переменная, объект класса и т. д.) указатель на следующий узел в списке. Элементы связанного списка можно помещать и исключать произвольным образом.Доступ к списку осуществляется через указатель, который содержит адрес первого элемента списка, называемый корнем списка.Виды списков Односвязный линейный список: Каждый узел содержит 1 поле указателя на следующий узел. Поле указателя последнего узла содержит нулевое значение (указывает на NULL).Односвязный циклический список (последний элем к первому)Двусвязный линейный список (также есть указ на пред элемент)Двусвязный циклический список.Основные действия, производимые над элементами списка: Инициализация списка Добавление узла в список Удаление узла из списка Удаление корня спискаВывод элементов списка Взаимообмен двух узлов спискаСТЕК Стеком называется упорядоченный набор элементов, в котором размещение новых и удаление существующих происходит с одного конца, называемого вершиной. Принцип работы стека LIFO: LAST - последний INPUT - вошел FIRST - первый OUTPUT – вышелОперации для работы со стеком (пример) инициализация стека помещение элемента в стек удаление элемента из стека определение верхнего элемента без его удаления получение вершины стека (количества элементов) печать стека определение пустоты стекаСпособы реализации стека с помощью одномерного массива; с помощью связанного списка; с помощью класса объектно-ориентированного программирования.Очередь Очередью называется упорядоченный набор элементов, которые могут удаляться с её начала и помещаться в её конец. Очередь организована, в отличие от стека, согласно дисциплине обслуживания FIFO: FIRST - первый INPUT - вошел FIRST - первый OUTPUT – вышелПростейшие операции с очередью: инициализация очереди. помещение элемента в конец очереди удаление элемента из очереди проверка очереди (пустая или нет) вывод элементов очередиНАСЛЕДОВАНИЕ это зависимость и преемственность атрибутов данных и поведения от объекта к объекту. Объект может быть создан на базе другого объекта (родительского). При этом он наследует свойства и методы родительского объекта. Изменение родительского объекта приводит к изменению и дочерних объектов (всех объектов, созданных на базе родительского)