Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lect13

.pdf
Скачиваний:
6
Добавлен:
06.02.2016
Размер:
1.67 Mб
Скачать

13.Перегрузкаопераций

«Объектно-ориентированное программирование»

доцентПриваловМ.В.

Донецк,ДонНТУ,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

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