鱼C论坛

 找回密码
 立即注册
查看: 1878|回复: 5

C++运算符重载的问题

[复制链接]
发表于 2016-3-27 15:34:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
就是进行分数的加法运算
这里贴的是可以的代码

#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-27 15:37:51 | 显示全部楼层
[code]#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-27 15:39:37 | 显示全部楼层
错误提示是这个 QQ图片20160327153551.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-27 21:18:40 | 显示全部楼层
好长,头晕。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-27 22:57:32 | 显示全部楼层
本帖最后由 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,难道不需要约分了?所以你的约分部分应该放在后面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-3-27 23:16:55 | 显示全部楼层
muyu0096 发表于 2016-3-27 22:57
首先,不是所有编译器都无法通过引用模式的,我的vs2010可以通过
其次,看你的情况,有的版本的编译器对co ...

谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表