C++运算符重载的问题
就是进行分数的加法运算这里贴的是可以的代码
#include<iostream>
class Younumber
{
public:
Younumber();
Younumber(int a);
Younumber(int a,int b);
friend Younumber operator+(Younumber p,Younumber q);//问题就是这里,当我把形参改为传引用时,会出现问题,后面再讲
friend std::ostream& operator<<(std::ostream &cout,Younumber &p);//以分数形式打印出来
protected:
int fenzi;//分子
int fenmu;//分母
};
Younumber::Younumber()
{
fenzi=0;
fenmu=0;
}
Younumber::Younumber(int a,int b)
{
fenzi=a;
fenmu=b;
}
Younumber ::Younumber(int a)
{
fenzi=a;
fenmu=a;
}
std::ostream& operator<<(std::ostream &cout,Younumber &p)
{
if(p.fenzi%p.fenmu==0)
{
std::cout<<p.fenzi;
}
else
{
std::cout<<p.fenzi<<"/"<<p.fenmu;
}
}
Younumber operator+(Younumber p,Younumber q)
{ Younumber e;
//下面就是进行运算,还有进行分子分母约分的处理
if(p.fenmu!=q.fenmu)
{
e.fenzi=p.fenzi*q.fenmu+q.fenzi*p.fenmu;
e.fenmu=p.fenmu*q.fenmu;
if(e.fenmu>=e.fenzi)
{ int num=e.fenzi;
while(e.fenzi%num!=0||e.fenmu%num!=0)
{
num--;
}
e.fenzi=e.fenzi/num;
e.fenmu=e.fenmu/num;
}
else
{
int num=e.fenmu;
while(e.fenzi%num!=0||e.fenmu%num!=0)
{
num--;
}
e.fenzi=e.fenzi/num;
e.fenmu=e.fenmu/num;
}
}
else
{
e.fenzi=p.fenzi+q.fenzi;
e.fenzi=p.fenzi;
}
return e;
}
int main()
{
Younumber p(10,100);
Younumber q(100,10);
Younumber d(3,100);
Younumber c;
c=p+q+d;
std::cout<<c;
return 0;
} #include<iostream>
class Younumber
{
public:
Younumber();
Younumber(int a);
Younumber(int a,int b);
friend Younumber operator+(Younumber &p,Younumber &q);//把它改为传引用了,但是这样后,下面的p+q+d运算就提示错误了,但是我只p+q的话是可以的,就是不能多次运算,这是为什么嘞
friend std::ostream& operator<<(std::ostream &cout,Younumber &p);//以分数形式打印出来
protected:
int fenzi;//分子
int fenmu;//分母
};
Younumber::Younumber()
{
fenzi=0;
fenmu=0;
}
Younumber::Younumber(int a,int b)
{
fenzi=a;
fenmu=b;
}
Younumber ::Younumber(int a)
{
fenzi=a;
fenmu=a;
}
std::ostream& operator<<(std::ostream &cout,Younumber &p)
{
if(p.fenzi%p.fenmu==0)
{
std::cout<<p.fenzi;
}
else
{
std::cout<<p.fenzi<<"/"<<p.fenmu;
}
}
Younumber operator+(Younumber &p,Younumber &q)
{ Younumber e;
//下面就是进行运算,还有进行分子分母约分的处理
if(p.fenmu!=q.fenmu)
{
e.fenzi=p.fenzi*q.fenmu+q.fenzi*p.fenmu;
e.fenmu=p.fenmu*q.fenmu;
if(e.fenmu>=e.fenzi)
{ int num=e.fenzi;
while(e.fenzi%num!=0||e.fenmu%num!=0)
{
num--;
}
e.fenzi=e.fenzi/num;
e.fenmu=e.fenmu/num;
}
else
{
int num=e.fenmu;
while(e.fenzi%num!=0||e.fenmu%num!=0)
{
num--;
}
e.fenzi=e.fenzi/num;
e.fenmu=e.fenmu/num;
}
}
else
{
e.fenzi=p.fenzi+q.fenzi;
e.fenzi=p.fenzi;
}
return e;
}
int main()
{
Younumber p(10,100);
Younumber q(100,10);
Younumber d(3,100);
Younumber c;
c=p+q+d;
std::cout<<c;
return 0;
} 错误提示是这个
好长,头晕。。。 本帖最后由 muyu0096 于 2016-3-27 22:58 编辑
首先,不是所有编译器都无法通过引用模式的,我的vs2010可以通过
其次,看你的情况,有的版本的编译器对const引用参数 进行了语义限制,下面具体的说:
当你连加的时候,p+q返回一个值,这个值是临时变量,然后这个临时变量的引用,作为参数再和d相加。
但临时变量是不能被你操作的,所以应该是一个常量值,但你声明的参数对象又是一个变量引用,这产生了矛盾,所以编译器不让你通过。
所以你2个相加可以,多个相加不行。
解决办法是把参数声明为const引用
friend Younumber operator+(const Younumber & p,const Younumber & q)
实际上,只要能声明为const的尽量都声明成const,不仅是为了编译成功,也是防止自己无意中修改不改修改的值。
最后,关于你的对象加法的函数实现,有点要说,分母相同,一样可能存在结果的约分问题啊,1/4+ 1/4=2/4,难道不需要约分了?所以你的约分部分应该放在后面
muyu0096 发表于 2016-3-27 22:57
首先,不是所有编译器都无法通过引用模式的,我的vs2010可以通过
其次,看你的情况,有的版本的编译器对co ...
谢谢啦
页:
[1]