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

Lect13

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

Реализациядружественной

операциисложения

class Vector2D

{

public:

friend Vector2D const operator + (Vector2D const& vector1, Vector2D const& vector2);

};

Vector2D const operator +(Vector2D const& vector1, Vector2D const& vector2)

{

return Vector2D(vector1.x + vector2.x, vector1.y + vector2.y);

}

11

Выборпредпочтительного способаперегрузки

Вданномслучаепредпочтительным способомявляетсяреализация операциисложениявнутрикласса

Естественностьданнойоперациидля классавекторов

Возможностьвнесенияизмененийв исходныйкодкласса Vector2D

Наиболеекраткая формазаписи

12

Примериспользования

class Vector2D { public:

Vector2D const operator +(Vector2D const& vector2)const;

};

int main(int argc, char * argv[]) { Vector2D a(3.0, 5.8); Vector2D b(7.3, 8.8);

Vector2D c = a + b + Vector2D(3, 9);

return 0;

}

13

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

Вданномслучаеоперациявычитания практическиполностьюидентична операциисложения

Предпочитаемыйспособперегрузки– реализациятакжевнутриклассаVector2D

Vector2D const operator – (Vector2D const& vector2)const {

return Vector2D(x - vector2.x, y - vector2.y);

}

14

Перегрузкаоперацииумножения

Умножениевекторанаскаляр – более сложнаяоперация,т.к.используетразные типыаргументовиявляется коммутативной

Одинизаргументов– вектор(Vector2D), второй– скаляр (double)

Из-закоммутативностиданнойоперации существуют2версииданногооператора:

Вектор*Скаляр

Скаляр*Вектор

15

Перегрузкаоперацииумножения

Приперегрузкеданнойоперациипринимаемво вниманиеследующиеособенности

Даннаяоперацияявляетсябинарнойс параметрамиразличныхтипов

Операциявозвращаетновыйконстантный вектор,координатыкоторого– произведения координатисходноговекторанаскаляр

Константность обязательна,чтобынедопустить конструкциивида:

(vector1 *3)=vector2; (10*vector3)=vector4;

16

Реализацияоперацииумножения

class Vector2D { public:

Vector2D const operator * (double scalar)const {

return Vector2D(x * scalar, y * scalar);

}

};

Vector2D const operator *(double scalar, Vector2D const& vector) {

return Vector2D(scalar * vector.x, scalar *vector.y);

}

17

 

Примериспользования

#include "Vector2D.h"

int main(int argc, char * argv[]) { Vector2D a(3.0, 2.1); Vector2D b(4.0, 5.1);

Vector2D c = a * 3.4;

Vector2D d = 8.4 * b;

Vector2D e = (a + b) * 3 + (c – d) * 4;

return 0;

}

18

Перегрузкаделениянаскаляр

Длявекторовтакжеопределенаоперация делениявекторанаскаляр

Результатомданнойоперацииявляется векторскоординатами,равными отношениюкоординатисходноговекторак скаляру

Даннаяоперацияперегружаетсявнутри классааналогично операцииумножения векторанаскаляр

19

Перегрузкаприсваивающих операций+=, -= ит.п.

Помимоопераций+,- и*могут понадобитьсяданныедействияв составеоперацииприсваивания:

vector1 += vector2;

vector3 *= 3.8;

vector4 -= vector1;

Особенностьюданныхопераций являетсято,чтоонимодифицируют операндвлевойчасти,ноне модифицируютоперандвправой

20

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