Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Перегрузка операторов.
В языке С++ имеется возможность определять функции, имена которых совпадают с именами встроенных операторов: +, -, *, / и.т.д. Такие функции определяются с ключевым словом operator. Они называются функциями операторами. При вызове функций достаточно указывать только знак оператора, например, (+). Как правило, в функциях операторах выполняются действия, которые отражаются знаком используемого оператора, что делает программы более наглядными и понятными.
Правила перегрузки операторов.
Перегружены могут быть любые операторы языка С++, за исключением операторов
. .* :: ?:
Нельзя менять синтаксис операторов, например, нельзя определить оператор перемножения сразу трех дробей, так как встроенный оператор умножения бинарный:
Fraction operator*(Fraction a, Fraction b, Fraction c); //Ошибка, 3 сомножителя
Для перегруженных операторов сохраняются приоритеты и порядок выполнения.
Функция оператор должна быть или членом класса, или иметь аргумент типа класса. Нельзя определить функцию оператор, имеющую только аргументы встроенных типов, например, нельзя определить функцию int и double:
double operator+(int, double); //Ошибка, аргументы
//только встроенных функций
// Fraction.h
#ifndef FRACTIONH
#define FRACTIONH
#include<iostream.h>
class Fraction{
int num; //числитель
int denom; //знаменатель
public:
Fraction(int n=1,int m=1){num=n; denom=m;} //конструктор
//методы доступа к закрытым членам
int numerator() { return num;}
int denominator() { return denom;}
Fraction operator+(Fraction a); //метод сложения
Fraction operator-() //изменение знака дроби
{ return Fraction(-num,denom);}
//функция-друг вычитания дробей
friend Fraction operator-(Fraction a,Fraction b);
void print() //вывод дроби
{cout<<num<<'/'<<denom;}
};
//независимая функция для умножения дробей
Fraction operator*(Fraction a,Fraction b);
#endif
//файл Fraction.cpp
#include "Fraction.h"
Fraction Fraction::operator+(Fraction b) //сложение дробей
{
int cd=denom*b.denom; //общий знаменатель
int ns=num*b.denom+b.num*denom; //числитель суммы
Fraction sum(ns,cd); //sum-сумма дробей
return sum;
}
Fraction operator-(Fraction a,Fraction b) //вычитание дробей
{
int cd=a.denom*b.denom; //лбщий знаменатель
int ns=a.num*b.denom-b.num*a.denom; // числитель разности
Fraction subtr(ns,cd); //subtr-разность дробей
return subtr;
}
Fraction operator*(Fraction a,Fraction b)
{
int np=a.numerator()*b.numerator(); //числитель произведения
int dp=a.denominator()*b.denominator(); //знаменатель произведения
return Fraction(np,dp);
}
//файл FractOpr.cpp
#include "Fraction.H"
#include<conio.h>
int main()
{
Fraction f12(1,2),f13(1,3),fs,fd,fp,fm;
cout<<"f12= "; f12.print(); cout<<endl;
cout<<"f13= "; f13.print(); cout<<endl;
fs=f12.operator+(f13); //явный вызов функции-оператора
cout<<"f1s= "; fs.print(); cout<<endl;
fd=f12-f13; //неявный вызов
cout<<"fd= "; fd.print(); cout<<endl;
fp=f12*f13;
cout<<"fp= "; fp.print(); cout<<endl;
fm=-f12;
cout<<"fm= "; fm.print(); cout<<endl;
}