在C ++中通过引用返回结果

时间:2018-03-30 23:37:05

标签: c++ reference return operator-overloading this

我正在用C ++练习一些东西,我遇到了一个我可以解决的任务,但我对下面的代码感到很好奇。我不知道为什么我们在这两个函数中通过引用返回我们的值:

fraction& operator+=(fraction);
fraction& operator++();

#include <iostream>
using namespace std;

class fraction
{
private:
    int br;
    int im;
public:
    fraction(int=0,int=1);
    fraction& operator+=(fraction);
    fraction& operator++();
    fraction operator++(int);
    void print(){cout<<br<<"/"<<im<<endl;}
};

fraction::fraction(int a,int b):br(a),im(b){}

fraction& fraction::operator+=(fraction r)
{
    br = br*r.im + im*r.br;
    im = im*r.im;
    return *this;
}

fraction& fraction::operator++()
{
    return (*this)+=1;
}

fraction fraction::operator++(int i)
{
    fraction pom(*this);
    (*this)+=1;
    return pom;
}

int main()
{
    cout<<"Type in the values for fractions"<<endl;
    int b,i;
    cin>>b>>i;
    fraction r1(b,i);
    cin>>b>>i;
    fraction r2(b,i);
    r1+=(r2++);
    r1.print();
}

然后我尝试删除这些函数中的&,并且该代码也运行良好:

#include <iostream>
using namespace std;

class fraction
{
private:
    int br;
    int im;
public:
    fraction(int=0,int=1);
    fraction operator+=(fraction);
    fraction operator++();
    fraction operator++(int);
    void print(){cout<<br<<"/"<<im<<endl;}
};

fraction::fraction(int a,int b):br(a),im(b){}

fraction fraction::operator+=(fraction r)
{
    br = br*r.im + im*r.br;
    im = im*r.im;
    return *this;
}

fraction fraction::operator++()
{
    return (*this)+=1;
}

fraction fraction::operator++(int i)
{
    fraction pom(*this);
    (*this)+=1;
    return pom;
}

int main()
{
    cout<<"Type in the values for fractions"<<endl;
    int b,i;
    cin>>b>>i;
    fraction r1(b,i);
    cin>>b>>i;
    fraction r2(b,i);
    r1+=(r2++);
    r1.print();
}

所以,我的问题是,为什么我们在第一个代码中使用&

另外,如果您能告诉我为什么这段代码不起作用,我将不胜感激。它是上述两个代码的组合,我只从一个函数中删除了&

#include <iostream>
using namespace std;

class fraction
{
private:
    int br;
    int im;
public:
    fraction(int=0,int=1);
    fraction operator+=(fraction);
    fraction& operator++();
    fraction operator++(int);
    void print(){cout<<br<<"/"<<im<<endl;}
};

fraction::fraction(int a,int b):br(a),im(b){}

fraction fraction::operator+=(fraction r)
{
    br = br*r.im + im*r.br;
    im = im*r.im;
    return *this;
}

fraction& fraction::operator++()
{
    return (*this)+=1;
}

fraction fraction::operator++(int i)
{
    fraction pom(*this);
    (*this)+=1;
    return pom;
}

int main()
{
    cout<<"Type in the values for fractions"<<endl;
    int b,i;
    cin>>b>>i;
    fraction r1(b,i);
    cin>>b>>i;
    fraction r2(b,i);
    r1+=(r2++);
    r1.print();
}

对于noob问题很抱歉,但我刚开始用C ++练习,我花了好几个小时试图解决这个问题。

1 个答案:

答案 0 :(得分:0)

  

所以,我的问题是,为什么我们在第一个代码中使用&

&用于表现和一致性原因。 两个运算符(预增量运算符++和赋值运算符+=)从其假设修改提供的值。 E.g:

int i=5;
std::cout << ++i; // This will print 6. Notice there is no more value 5, even here
std::cout << i;   // This will print 6 also.

由于原始值丢失,因此无需创建新对象并销毁当前对象。只需要重新使用当前对象来提供新值。

我建议在重载运算符时查看引用,因为很容易创建具有性能损失或不能与const对象一起使用的自有版本。这是一些链接。

  

另外,如果你能告诉我为什么这段代码不起作用,我将不胜感激。这是上面两个代码的组合,我删除了&amp;只有一个功能。

这个有点棘手。 如果你仔细看看第三个例子中的代码:

fraction fraction::operator+=(fraction r)
{
    br = br*r.im + im*r.br;
    im = im*r.im;
    return *this;
}

fraction& fraction::operator++()
{
    return (*this)+=1;
}

您会注意到operator++正在使用operator+=。 实际上operator++返回operator+=返回的内容,因此operator++返回对fraction结束时销毁的本地operator++对象的引用。你可以参考被破坏的物体。这很糟糕,这就是为什么它不起作用的原因。