🗊 Презентация Перегрузка операторов

Категория: Образование
Нажмите для полного просмотра!
Перегрузка операторов, слайд №1 Перегрузка операторов, слайд №2 Перегрузка операторов, слайд №3 Перегрузка операторов, слайд №4 Перегрузка операторов, слайд №5 Перегрузка операторов, слайд №6 Перегрузка операторов, слайд №7 Перегрузка операторов, слайд №8 Перегрузка операторов, слайд №9 Перегрузка операторов, слайд №10 Перегрузка операторов, слайд №11 Перегрузка операторов, слайд №12 Перегрузка операторов, слайд №13 Перегрузка операторов, слайд №14 Перегрузка операторов, слайд №15 Перегрузка операторов, слайд №16 Перегрузка операторов, слайд №17 Перегрузка операторов, слайд №18 Перегрузка операторов, слайд №19 Перегрузка операторов, слайд №20 Перегрузка операторов, слайд №21 Перегрузка операторов, слайд №22 Перегрузка операторов, слайд №23 Перегрузка операторов, слайд №24 Перегрузка операторов, слайд №25 Перегрузка операторов, слайд №26 Перегрузка операторов, слайд №27 Перегрузка операторов, слайд №28

Содержание

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

Слайды и текст этой презентации


Слайд 1


Перегрузка операторов В качестве примеров полиморфизма в С++ мы имели дело с перегрузкой функций. А что с перегрузкой операторов? По сути дела каждый...
Описание слайда:
Перегрузка операторов В качестве примеров полиморфизма в С++ мы имели дело с перегрузкой функций. А что с перегрузкой операторов? По сути дела каждый оператор в С++ и представляет собой функцию. Операторы могут иметь один или два аргумента. Если аргумент один, то такой оператор называется унарным. Пример ++ или --. Если аргументов два, то мы имеем дело с бинарным оператором. Важно! В С++ нельзя перегрузить операторы встроенных типов! Это означает, что невозможно перегрузить оператор ++ таким образом, чтобы он инкрементировал элементы одномерного массива типа int. Все операторы встроенных типов С++ и так являются перегруженными и поэтому не стоит их перегружать. Любые операции по перегрузке операторов относятся только к пользовательским типам данных, а точнее – к типам, которые описывают объекты. Перегрузка операторов очень похожа на перегрузку функций. Перегруженный оператор может являться членом класса или быть дружественным к нему. В С++ нельзя перегрузить оператор отдельно от класса. Если предполагается использование перегруженного оператора за пределами класса, он должен быть объявлен как public.

Слайд 2


Перегрузка операторов – как и что можно Прототип перегруженного оператора задается следующей синтаксической формой:
Описание слайда:
Перегрузка операторов – как и что можно Прототип перегруженного оператора задается следующей синтаксической формой:

Слайд 3


Перегрузка операторов - ограничения Нельзя перегрузить приоритет какого-либо оператора. Это значит что вычисление (--k*2)+4 всегда будет происходить...
Описание слайда:
Перегрузка операторов - ограничения Нельзя перегрузить приоритет какого-либо оператора. Это значит что вычисление (--k*2)+4 всегда будет происходить в соответствии с приоритетами в последовательности: декрементация k, умножение результата на 2, добавление к результату 4. И никак нельзя перегрузить оператор +, чтобы он выполнялся первым. Могут быть перегружены и такие операторы С++ как new и delete. Нельзя перегрузить унарный оператор таким образом, чтобы он работал как бинарный и наоборот. Оператор не может иметь аргументов по умолчанию

Слайд 4


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

Слайд 5


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

Слайд 6


Перегрузка унарных операторов «++» и «--» Особо следует уделить внимание перегрузке операторов инкремента и декремента, поскольку только эти...
Описание слайда:
Перегрузка унарных операторов «++» и «--» Особо следует уделить внимание перегрузке операторов инкремента и декремента, поскольку только эти операторы имеют постфиксную и префиксную формы. Различие этих форм осуществляется путем использования второго фиктивного аргумента типа int. Если необходимо подчеркнуть , что оператор будет использоваться в постфиксной форме, то необходимо наличие этого аргумента, который по умолчанию устанавливается в 0. Для класса Nmb:

Слайд 7


Перегрузка дружественных унарных операторов «++» и «--» В случае перегрузки указанных операторов как дружественных по отношению к классу, их описание...
Описание слайда:
Перегрузка дружественных унарных операторов «++» и «--» В случае перегрузки указанных операторов как дружественных по отношению к классу, их описание может быть выполнено как:

Слайд 8


Перегрузка бинарных операторов Начнем со случая перегрузки операторов как членов класса. Функция реализации бинарного оператора будет иметь только...
Описание слайда:
Перегрузка бинарных операторов Начнем со случая перегрузки операторов как членов класса. Функция реализации бинарного оператора будет иметь только один аргумент. Объясняется это тем, что второй аргумент по умолчанию является экземпляром этого класса. Для начала перегрузим бинарные операторы «+» и «-» таким образом, чтобы их можно было использовать так: единственный аргумент при перегрузке будет иметь тип int. В обоих случаях эти операторы должны возвращать объекты, поскольку результатом операции является объект, который присваивается другому.

Слайд 9


Перегрузка бинарных операторов - как Для того, чтобы не возникло никаких побочных эффектов при возврате объекта из перегруженного оператора,...
Описание слайда:
Перегрузка бинарных операторов - как Для того, чтобы не возникло никаких побочных эффектов при возврате объекта из перегруженного оператора, необходимо наличие конструктора копирования (если необходимо). Важно! Данные операторы работают только при записях, приведенных в примерах их использования. Если бы перегруженные операторы работали без временных объектов и возвращали бы ссылки на текущие объекты, то использование таких операторов было бы некорректным. Почему? В случае операции n2 = n1 + 5 сначала бы сработал оператор «+», который бы изменил объект n1, а затем измененный объект присвоил бы объекту n2, т.е. произошло бы изменение сразу двух объектов. Важно! Использовать данный оператор можно только в данной записи, когда первым операндом выступает объект-переменная, а вторым – константа. Это значит, что компилятор не пропустит записи вида n2 = 5+n1. Дело в том, что при такой записи для компилятора появляются два явных аргумента – это целое число и экземпляр класса. В этом случае при описании оператора внутри класса компилятор не пропустит эту запись и выдаст сообщение о том, что у бинарного оператора +(-) должен быть один аргумент, а не 2.

Слайд 10


Перегрузка бинарных операторов как дружественных Для решения этой проблемы можно определить перегружаемый оператор как дружественный к данному...
Описание слайда:
Перегрузка бинарных операторов как дружественных Для решения этой проблемы можно определить перегружаемый оператор как дружественный к данному классу. В этом случае передача ссылки на объект в качестве второго аргумента кажется весьма оправданной!

Слайд 11


Перегрузка операторов расширенного присвоения Рассмотрим теперь перегрузку оператора расширенного присвоения, используемую в записи вида n2 += 6...
Описание слайда:
Перегрузка операторов расширенного присвоения Рассмотрим теперь перегрузку оператора расширенного присвоения, используемую в записи вида n2 += 6 (упрощенная форма для записи n2 = n2+6) Для решения этой проблемы можно определить перегружаемый оператор “+=“, имеющий два аргумента – целое число и объект. При этом оператор должен возвращать ссылку на тот объект, который используется в качестве аргумента, т.е. ссылку на самого себя.

Слайд 12


Перегрузка бинарных операторов над объектами Мы рассматривали случаи, когда операция выполнялась над разными типами данных: один объект Nmb, а второй...
Описание слайда:
Перегрузка бинарных операторов над объектами Мы рассматривали случаи, когда операция выполнялась над разными типами данных: один объект Nmb, а второй – встроенный тип int. Но можно перегрузить бинарные операторы так, чтобы оба операнда были объектами данного класса. Для оператора сложения определение метода будет выглядеть таким образом, что:

Слайд 13


Перегрузка операторов присвоения Рассмотрим теперь перегрузку оператора присваивания «=», который тоже является бинарным. Важно! Перегрузка не может...
Описание слайда:
Перегрузка операторов присвоения Рассмотрим теперь перегрузку оператора присваивания «=», который тоже является бинарным. Важно! Перегрузка не может быть выполнена в форме дружественного к классу оператора – обязательно должен быть членом класса. Применяется этот оператор в качестве механизма, предотвращающего создание копий и побитного копирования экземпляров класса. Для класса Nmb оператор будет иметь один явный аргумент – константную ссылку на объект и возвращать ссылку на модифицированный объект:

Слайд 14


Перегрузка логических операторов и операторов отношения Все операторы данных типов являются бинарными и если они перегружаются как члены класса, то...
Описание слайда:
Перегрузка логических операторов и операторов отношения Все операторы данных типов являются бинарными и если они перегружаются как члены класса, то должны иметь один аргумент – объект или ссылку на него. В качестве возвращаемого типа должен указываться один из встроенных типов данных, который говорил нам верно ли предложенное выражение. Это позволит при проверке использовать сложные выражения. Для класса Nmb оператор «==» может быть перегружен следующим образом:

Слайд 15


Перегрузка операторов ввода/вывода Операторы потокового ввода/вывода «» уже являются перегруженными в стандарте языка С++. Для реализации...
Описание слайда:
Перегрузка операторов ввода/вывода Операторы потокового ввода/вывода «» уже являются перегруженными в стандарте языка С++. Для реализации ввода/вывода в С++ используются стандартные классы. Одними из таких классов являются ostream и istream. Данные классы созданы для поддержки стандартного вывода и ввода данных соответственно. Экземпляры данных классов - cout и cin. Их можно перегружать. Но! Данные операторы не могут быть членами какого-либо класса, но могут быть дружественными классу.

Слайд 16


Перегрузка оператора ввода Форма перегрузки оператора извлечения из потока похожа на перегрузку оператора «
Описание слайда:
Перегрузка оператора ввода Форма перегрузки оператора извлечения из потока похожа на перегрузку оператора «

Слайд 17


Перегрузка манипуляторов Для стандартных потоков данных в С++ могут быть применены специальные операторы, называемые манипуляторами. Манипуляторы...
Описание слайда:
Перегрузка манипуляторов Для стандартных потоков данных в С++ могут быть применены специальные операторы, называемые манипуляторами. Манипуляторы предоставляют средства форматированного ввода/вывода. Часть стандартных марипуляторов определа в заголовочном файле iostream, а часть – в файле iomanip. Один из манипуляторов – endl - переход к новой строке и очистка буфера. Еще: oct, dec, hex – манипуляторы, которые отвечают за установку системы счисления для выводимых данных. Все вышеперечисленные манипуляторы работают с внутренними компонентами, в данном случае, класса ostream, и действуют до их явной отмены. Средства работы с манипуляторами в С++ являются расширяемыми.

Слайд 18


Определение собственных манипуляторов Пользователь может определить свой собственный манипулятор. Рассмотрим построение манипулятора, который...
Описание слайда:
Определение собственных манипуляторов Пользователь может определить свой собственный манипулятор. Рассмотрим построение манипулятора, который записывает в выходной поток десять символов «*».

Слайд 19


Определение манипуляторов с параметром int Пользователь может определить свой собственный манипулятор, у которого есть один или более аргументов. В...
Описание слайда:
Определение манипуляторов с параметром int Пользователь может определить свой собственный манипулятор, у которого есть один или более аргументов. В заголовочном файле iomap описан ряд специальных макросов, предназначенных для создания манипуляторов с аргументами. Простейшие манипуляторы могут принимать только один аргумент типа int или long. В этом специальном случае используется макрос _Smanip:

Слайд 20


Определение манипуляторов с параметрами При использовании параметра другого типа используется техника, которая продемонстрирована на следующем...
Описание слайда:
Определение манипуляторов с параметрами При использовании параметра другого типа используется техника, которая продемонстрирована на следующем примере:

Слайд 21


Определение манипуляторов с параметрами 2 Продолжение примера:
Описание слайда:
Определение манипуляторов с параметрами 2 Продолжение примера:

Слайд 22


Перегрузка оператора new В С++ имеются две возможности перегрузки операторов new() и delete() - локально (в пределах класса) и глобально (в пределах...
Описание слайда:
Перегрузка оператора new В С++ имеются две возможности перегрузки операторов new() и delete() - локально (в пределах класса) и глобально (в пределах программы). Эти операторы имеют правила переопределения, отличные от рассмотренных правил переопределения других операторов. Одна из причин перегрузки этих операторов состоит в том, чтобы придать им допол-нительную семантику, например, для обеспечения выдачи диагностической информа-ции, или увеличения защищенности от ошибок. Кроме того, класс может иметь более эффективную схему распределения памяти, чем та, которая обеспечивается системой. Оператор new можно задать в следующих формах: new имя_типа ; new имя_типа [ ]; Параметр ”аргументы” можно использовать либо для того, чтобы различить разные версии глобальных операторов new, либо для использования их в теле функции operator. Доопределенную функцию operator new можно объявить: void *operator new(size_t t, ); void *operator new[](size_t t, ); Вторая форма используется для выделения памяти для массивов. Возвращаемое значение всегда должно иметь тип void *. Единственный обязательный аргумент функции operator всегда должен иметь тип size_t. При этом в функцию operator автоматически подставляется аргумент sizeof(t).

Слайд 23


Перегрузка оператора new - пример
Описание слайда:
Перегрузка оператора new - пример

Слайд 24


Перегрузка оператора new - пример В
Описание слайда:
Перегрузка оператора new - пример В

Слайд 25


Перегрузка оператора delete Оператор delete разрешается доопределять только по отношению к классу. В то же время можно заменить системную версию...
Описание слайда:
Перегрузка оператора delete Оператор delete разрешается доопределять только по отношению к классу. В то же время можно заменить системную версию реализации оператора delete на свою. Доопределенную функцию operator delete можно объявить: void operator delete(void *p); void operator delete[](void *p); Функция operator должна возвращать значение void и имеет один обязательный аргумент типа void * - указатель на область памяти, которая должна быть освобождена.

Слайд 26


Перегрузка оператора delete - пример
Описание слайда:
Перегрузка оператора delete - пример

Слайд 27


Перегрузка оператора delete - использование Необходимо отметить тот факт, что при реализации переопределения глобальной функции delete в ней не...
Описание слайда:
Перегрузка оператора delete - использование Необходимо отметить тот факт, что при реализации переопределения глобальной функции delete в ней не должен использоваться оператор delete[], так как это приведет к бесконечной рекурсии. При выполнении инструкции системный оператор delete ptr2 сначала вызывается локальная функция доопределения оператора delete для класса cls, а затем из нее глобальная функция переопределения delete.

Слайд 28


Перегрузка операторов new – delete warning C4291: 'void *cls::operator new(size_t,int)' : no matching operator delete found; memory will not be freed...
Описание слайда:
Перегрузка операторов new – delete warning C4291: 'void *cls::operator new(size_t,int)' : no matching operator delete found; memory will not be freed if initialization throws an exception Нужны добавки!



Похожие презентации
Mypresentation.ru
Загрузить презентацию