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

Lect13

.pdf
Скачиваний:
7
Добавлен:
06.02.2016
Размер:
2 Мб
Скачать
☆

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

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