Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_Obektno-orientirovannoe_programmirovan...doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
351.74 Кб
Скачать

4.3.1. Использование дружественных функций при перегрузке операций

Поскольку функции-друзья не являются элементами классов, они не могут иметь неявный аргумент this. Поэтому при использовании дружественной функции-оператора оба операнда передаются функции при перегрузке бинарных операций, а при перегрузке унарных операций передается один операнд. В качестве примера в листинге 4.2 приведена модифицированная версия программы из листинга 4.1, в которой операции + и ++ перегружены с помощью дружественных функций.

Листинг 4.2. Перегрузка операций с помощью дружественных функций.

#include <iostream.h>

#include <math.h>

class V_3d

{

int x,y,z;

public:

//конструктор по умолчанию

V_3d(){x=0;y=0;z=0;};

//конструктор, принимающий параметры

V_3d(int x1,int y1,int z1)

{

x=x1; y=y1; z=z1;

};

//вывод вектора

Void print();

// функция-друг для перегрузки +

friend V_3d operator +(V_3d op1, V_3d op2);

// функция-друг для перегрузки ++

friend V_3d operator ++(V_3d &op1);

// функция для перегрузки =

V_3d operator =( V_3d t);

};

Void main(void)

{

//создание объектов а, b, d, s класса V_3d

V_3d a(2,3,5);

V_3d b(5,6,5);

V_3d d,s;

cout << "координаты вектора a:\n";

a.print();

cout << "координаты вектора b:\n";

b.print();

d=a+b; //демонстрация перегруженной

// операции сложения векторов a и b

cout << "\n сумма векторов a и b :\n";

d.print();

s=a; // демонстрация перегруженной операции присваивания

cout << "\n координаты вектора s\n";

s.print();

++s;

cout << "\n координаты вектора s после увеличения на 1\n";

s.print();

}

//метод класса для вывода координат вектора

Void v_3d::print()

{

cout << "x= " << x << " y= " << y << " z= " << z <<"\n";

}

// определение дружественной функции - оператора +

V_3d operator +(V_3d op1,V_3d op2)

{

V_3d c;

c.x=op1.x+op2.x;

c.y=op1.y+op2.y;

c.z=op1.z+op2.z;

return c;

}

// определение дружественной функции - оператора ++

V_3d operator ++(V_3d &op1)

{

op1.x++;

op1.y++;

op1.z++;

return op1;

}

// определение функции - оператора=

V_3d V_3d::operator =(V_3d t)

{

x=t.x;

y=t.y;

z=t.z;

return *this;

}

Результаты работы этой программы:

координаты вектора a :

x= 2 y= 3 z= 5

координаты вектора b:

x= 5 y= 6 z= 5

сумма векторов a и b :

x= 7 y= 9 z= 10

координаты вектора s

x= 2 y= 3 z= 5

координаты вектора s после увеличения на 1

x= 3 y= 4 z= 6

Из этой программы видно, что дружественной функции operator + передаются оба операнда. Левый операнд передается в переменной op1, а правый – в переменной op2. Дружественной функции operator ++ передается один операнд – ссылка на объект, так как она должна модифицировать элементы – данные объекта.

Рекомендация:

Для перегрузки операций следует пользоваться функциями-методами. Функции-друзья предназначаются в С++ большей частью для специальных ситуаций.

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