Lect13
.pdf13.Перегрузкаопераций
«Объектно-ориентированное программирование»
доцентПриваловМ.В.
Донецк,ДонНТУ,2011
1
Назначениеперегрузкиопераций
Длянекоторыхобъектныхтиповданных естественнымиможетоказатьсяиспользование операций,определенныхдлябазовыхтипов:
◦+=и+дляконкатенациистрок
◦-- и++дляитераторов
◦арифметические операциидлявекторов,матрици комплексных чисел
◦->и*дляумныхуказателей(Smart Pointers)
◦[]длямассивовиассоциативныхконтейнеров
◦()дляфункторов(объектовфункций)
◦=дляклассовссобственнымконструктором копирования
◦операциисравнениядлястрокидругихтипов
2
Перегрузкаопераций
ДляпользовательскихтиповданныхC++ позволяетзадать собственныеоперации
◦Некоторыеизнихвсегдаопределяются внутрикласса
=,+=,-=,*=ит.п.
[]()->
◦Некоторые– снаружи
Какправило, операции, вкоторыхприменяютсябазовые типыилипервыйаргумент– объектдругого класса.
Синтаксис:
<тип> operator X(параметры)
3
Ограниченияперегрузки
Нельзяизменитьприоритетопераций– он будет темже,чтоивслучаепримененияоперациик базовымтипам
Нельзяизменитьколичествооперандов.Унарные операцииостанутсяунарными,бинарные– бинарными.
Несколькооперациивообщезапрещено перегружать:
. :: ?: sizeof
4
Пример:векторнаплоскости
Длявекторовнаплоскостиопределеныоперации сложения,вычитанияиумножениянаскаляр,а такжеоперациипроверкинаравенство(и неравенство)
◦Примоделированииклассавектораудобнобудет перегрузитьсоответствующиеарифметическиеоперации
Приперегрузкеоперацийследует руководствоваться:
◦Особенностямиданныхоперацийвпредметнойобласти
◦Архитектуройкласса
◦ТребованиямииограничениямиязыкаC++
◦Здравымсмыслом
5
КаркасклассаVector2D
class Vector2D { public:
Vector2D(double x0 = 0, double y0 = 0) :x(x0), y(y0)
{
}
//методы и операции над векторами
//данные объявляем публичными,
//т.к. в данном конкретном случае
//нет необходимости (и даже вредно)
//создавать для них методы
double |
x, y; |
};
6
Перегрузкаоперациисложения
Приперегрузкеданной операциипринимаемво внимание следующиеособенности
◦Операциясложения являетсябинарной
◦Обааргументаоперациисложения являютсявекторами, значениякоторыхнеизменяютсявовремяего выполнения
◦Вывод:имеетсмысл передаватьаргументыпоконстантной ссылке
Операциясложениявектороввозвращаетновый константный вектор,координатыкоторого– суммы соответствующихкоординатаргументов
Константностьобязательна,чтобынедопустить
конструкциивида:
(vector1 + vector2) = vector3;
(дляцелых идействительных чиселданнаяоперация такжезапрещена)
7
Перегрузкаоперациисложения
Операциясложениявекторовможетбыть реализованатремяспособами.
Какоперация,объявленнаявнутрикласса.
◦Вэтомслучаелевымаргументомоператорабудетявляться текущийэкземпляркласса,аправыйаргументбудет передаватьсячерезединственныйпараметр
Какоперация,объявленнаявнекласса
◦Вэтомслучаеоператорбудетприниматьдвааргумента
Какдружественныйоператор,объявленныйвне класса
◦Отличаетсяотпредыдущегоспособавозможностью доступакприватнымизащищеннымметодамиданным класса
8
Реализациявнутрикласса
class Vector2D
{
public:
…
Vector2D const operator +
(Vector2D const& vector2)const
{
return Vector2D(x + vector2.x, y + vector2.y);
}
…
};
9
Реализациявнекласса
class Vector2D { public:
…
…
};
Vector2D const operator +(Vector2D const& vector1, Vector2D const& vector2)
{
return Vector2D(vector1.x + vector2.x, vector1.y + vector2.y);
}
10