· 运算符重载
运算符重载就是对已知的运算符重新进行定义,使其据用心的功能,处理新的数据类型。
· 格式
函数类型 operator 运算符名称 (参数列表)
{
<函数体>;
}
· 注意事项
(1)“.”、“.*”、“::”、“sizeof”、“?:”这五个运算符不可以重载;
(2)重载不能改变运算符的操作数个数、不能改变其优先级别、不能改变其结合性;
(3)重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少有一个是类对象或者是类对象的引用;
· 利用运算符重载实现有理数四则运算
#include <iostream>
#include <string>
#include <stdlib.h>
class Rational
{
public:
Rational(int nume,int deno);
Rational operator+(Rational rhs);
Rational operator-(Rational rhs);
Rational operator*(Rational rhs);
Rational operator/(Rational rhs);
void print(); //打印
void simplify(); //对分子分母进行简化处理
private:
int numer;
int denom;
};
Rational::Rational(int nume,int deno)
{
numer=nume;
denom=deno;
}
Rational Rational::operator+(Rational rhs)
{
int a=numer;
int b=denom;
int c=rhs.numer;
int d=rhs.denom;
int e=a*d+c*b;
int f=b*d;
return Rational(e,f);
}
Rational Rational::operator-(Rational rhs)
{
rhs.numer=-rhs.numer;
return operator+(rhs);
}
Rational Rational::operator*(Rational rhs)
{
int a=numer*rhs.numer;
int b=denom*rhs.denom;
return Rational(a,b);
}
Rational Rational::operator/(Rational rhs)
{
int r=rhs.numer;
rhs.numer=rhs.denom;
rhs.denom=r;
return operator*(rhs);
}
void Rational::print()
{
if(numer%denom==0)
{
std::cout<<numer/denom;
}
else
{
std::cout<<numer<<"/"<<denom;
}
}
void Rational::simplify()//对分子分母进行简化处理
{
if(denom<0)
{
denom=-denom;
numer=-numer;
}
//对分子分母进行化简
//欧几里得算法去掉最大公约数
int a=abs(numer);
int b=abs(denom);
if(a<b)
{
int c=a;
a=b;
b=c;
}
while(b>0)
{
int r=a%b;
a=b;
b=r;
} //最大公约数为a
numer/=a;
denom/=a;
}
int main()
{
Rational Rat1(1,4);
Rational Rat2(3,6);
Rational Rat3=Rat1+Rat2;
Rat1.print();
std::cout<<"+";
Rat2.print();
std::cout<<"=";
Rat3.simplify();
Rat3.print();
std::cout<<std::endl;
Rational Rat4=Rat1-Rat2;
Rat1.print();
std::cout<<"-";
Rat2.print();
std::cout<<"=";
Rat4.simplify();
Rat4.print();
std::cout<<std::endl;
Rational Rat5=Rat1*Rat2;
Rat1.print();
std::cout<<"*";
Rat2.print();
std::cout<<"=";
Rat5.simplify();
Rat5.print();
std::cout<<std::endl;
Rational Rat6=Rat1/Rat2;
Rat1.print();
std::cout<<"/";
Rat2.print();
std::cout<<"=";
Rat6.simplify();
Rat6.print();
return 0;
}