|
Функция-оператор может быть другом класса, а не только его членом. Поскольку функции-друзья не являются членами класса, они не могут иметь неявный аргумент this. Поэтому при перегрузке дружественной бинарной функции-оператора оба операнда передаются функции, а при перегрузке унарных операторов передаётся один операнд. Следующие операторы не могут использовать перегрузку с помощью функций-друзей: =, (), [], и ->. В качестве примера ниже рассматривается модифицированная версия предыдущей программы, в которой оператор + перегружен с помощью дружественной функции.
Листинг 2
#include <iostream>
using namespace std;
class three_d {
int x,y,z;
public:
friend three_d operator+(three_d op1, three_d op2);
three_d operator=(three_d t);
void show();
void assign(int mx, int my, int mz);
};
//
three_d operator+(three_d op1, three_d op2)
{
three_d temp;
temp.x=op1.x+op2.x;
temp.y=op1.y+op2.y;
temp.z=op1.z+op2.z;
return temp;
}
//
three_d three_d::operator=(three_d t)
{
x=t.x;
y=t.y;
z=t.z;
return *this;
}
//
void three_d::show()
{
cout << x <<",";
cout << y <<",";
cout << z <<"\n";
}
//
void three_d::assign(int mx, int my, int mz)
{
x=mx;
y=my;
z=mz;
}
int main()
{
three_d a,b,c;
a.assign(1,2,3);
b.assign(10,10,10);
a.show();
b.show();
c=a+b;
c.show();
c=a+b+c;
c.show();
c=b=a;
c.show();
b.show();
return 0;
}
Перегрузка бинарного оператора с использованием дружественных функций позволяет использовать встроенные типы с объектами в одном выражении.
Контрольные вопросы.
1. Какие классы и функции называются дружественными?
2. Как осуществляется перегрузка операций?
3. Какие операторы не могут быть перегружены?
4. Какие операторы не могут быть перегружены как дружественные?
Лабораторное задание
Напишите программу согласно Вашему варианту задания с использованием проектов.
Варианты заданий
1, 6, 11, 16, 21, 26 | Определить класс – матрица размера 2´2. Элементы матрицы числа типа double. В класс включить функции: - задающую матрицу по передаваемым параметрам; - выдающую матрицу в виде квадратной таблицы на экран. Перегрузить операторы + и *, чтобы они выполняли операции сложения и умножения матриц размера 2´2, а также оператор * так, чтобы он выполнял и операцию умножения матрицы на действительное число типа double справа и слева. Функции при получении некорректных аргументов должны выдавать предупреждение. |
2, 7, 12, 17, 22, 27 | Определить класс – комплексное число. Действительная и мнимая части числа типа double. В класс включить функции: - конструктор, задающий значение числа по передаваемым параметрам (действительной и мнимой части); - возвращающие действительную и мнимую части числа. Перегрузить операторы + и *, чтобы они выполняли операции сложения и умножения комплексных чисел, а также оператор + так, чтобы он выполнял сложение комплексного числа с числом типа double справа и слева. Функции при получении некорректных аргументов должны выдавать предупреждение. |
3, 8, 13, 18, 23, 28 | Определить класс – комплексное число. Действительная и мнимая части числа типа double. В класс включить функции: - конструктор, задающий значение числа по передаваемым параметрам (действительной и мнимой части); - возвращающие действительную и мнимую части числа. Перегрузить операторы + и *, чтобы они выполняли операции сложения и умножения комплексных чисел, а также оператор * так, чтобы он выполнял умножение комплексного числа на число типа double справа и слева. Функции при получении некорректных аргументов должны выдавать предупреждение. |
4, 9, 14, 19, 24, 29 | Определить класс – рациональное число. Число должно представляться в виде несократимой дроби (числитель и знаменатель числа целого типа). В класс включить конструктор, задающий значение числа по передаваемым параметрам (числителю и знаменателю). Конструктор также должен получать несократимую дробь, даже если переданные ему числитель и знаменатель имеют общий делитель больше 1. В класс включить функции, возвращающие числитель и знаменатель, перегрузить операторы + и *, чтобы они выполняли операции сложения и умножения рациональных чисел, а также оператор + так, чтобы он выполнял сложение рационального числа с числом типа int справа и слева. Функции при получении некорректных аргументов должны выдавать предупреждение. |
5, 10, 15, 20, 25, 30 | Подстановка множества – взаимно однозначное отображение множества на себя. В случае отображения конечного множества Х на себя удобно считать, что Х={1, 2, …, n}, и записывать подстановку в виде , (*) где - некоторая перестановка чисел 1, 2, …, n. Запись (*) означает, что g переводит число k в ik, то есть g(k)= ik. Произведение подстановок a и b определяется как последовательное выполнение отображений a и b и задаются формулой ab(х)= b(a(х)). Определить класс – подстановка степени 5. В класс включить функции: - конструктор, задающий подстановку путем передачи ему нижней строки подстановки; - выводящую подстановку на консоль; - выводящую результат действия подстановки на числа от 1 до 5. Перегрузить оператор * так, чтобы он выполнял операцию произведения подстановок. Функции при получении некорректных аргументов должны выдавать предупреждение. |
Дата добавления: 2015-08-09; просмотров: 198 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Примеры программирования | | | Конические зубчатые передачи |