左移运算符重载
-
重载左移运算符也属于运算符的重载,不过语法有所不同。
-
下面是一个 operate << () 函数声明的原型:
std::ostream& operator << (std::ostream& os, Fenshu in);
-
第一个数参数os是将要写入的流,它是以“引用传递”的方式传递的。
-
第二个参数是打算写到那个流里面的数据值,不同的operator 函数就是因为这个输入参数才互相区别的。
注意: 第二个参数。不能使用传址,不然输出时,会改变参数的值,这在语法上也是不允许的。
代码实现
对分数的运算添加左移运算符重载
#include <iostream>
#include <cmath>
using namespace std;
class Fenshu
{
public:
Fenshu();
Fenshu(int num_in,int denum_in);
void print();
Fenshu operator +(Fenshu &in)
{
Fenshu temp;
temp.num=num*in.denum+denum*in.num;
temp.denum=in.denum*denum;
return temp;
}
Fenshu operator -(Fenshu &in)
{
/* num=-num; //法1:不好用:会改变num 的值,后面不好输出
return operator +(in);*/
Fenshu temp;
temp.num=(-num)*in.denum+denum*in.num;
temp.denum=in.denum*denum;
return temp;
}
Fenshu operator *(Fenshu &in)
{
Fenshu temp;
temp.num=num*in.num;
temp.denum=in.denum*denum;
return temp;
}
Fenshu operator /(Fenshu &in)
{
Fenshu temp;
temp.num=num*in.denum;
temp.denum=in.denum*num;
return temp;
}
private:
int num;
int denum;
void normalize();
friend ostream& operator <<(ostream& os,Fenshu t);
};
Fenshu::Fenshu()
{
num=0;
denum=0;
}
Fenshu::Fenshu(int num_in,int denum_in)
{
num=num_in;
denum=denum_in;
normalize();
}
//normalize()对分数进行简化操作包括:
//1.只允许分子为负数,如果分母为负数则把负数挪到分子部分,如1/-2==-1/2
//2.利用欧几里德算法(辗转求余原理)将分数进行简化:2/10 => 1/5
void Fenshu::normalize()
{
if(denum<0)
{
num=-num;
denum=-denum;
}
//用欧几里得算法求最大公约数:a
int a=abs(num);
int b=abs(denum);
while(b>0)
{
int t=a%b;
a=b;
b=t;
}
num/=a;
denum/=a;
}
ostream& operator<<(ostream & os,Fenshu t) //对左移运算符进行重载
{
t.normalize();
if(t.num==0) //分子是0,结果就是0
{
os << "0" ;
}
else if(t.denum==1)
{
os << t.num;
}
else
os << t.num << "/" << t.denum;
return os;
}
int main()
{
Fenshu a(2,4),b(1,2);
cout << a << " + " << b <<"= " << (a+b) << endl;
cout << a << " - " << b <<"= " << (a-b) << endl;
cout << a << " * " << b <<"= " << (a*b) << endl;
cout << a << " / " << b <<"= " << (a/b) << endl;
return 0;
}