我正在用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 ++练习,我花了好几个小时试图解决这个问题。
答案 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++
对象的引用。你可以参考被破坏的物体。这很糟糕,这就是为什么它不起作用的原因。