Lect13
.pdfРеализациядружественной
операциисложения
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