【发布时间】:2019-10-01 13:55:43
【问题描述】:
我之前曾问过类似的问题 (Why the code doesn't work on CodeBlocks,but on VS works)。
现在一个新的错误让我很困惑。
cout << ++a1 << endl; 将调用函数operator double()。
如果在代码Fraction& operator++() 中我删除& 使其成为Fraction operator++(),它将调用ostream& operator<<(ostream& os, Fraction&& obj)。
#include <iostream>
using namespace std;
class Fraction
{
private:
int fenzi, fenmu;
public:
Fraction(int a, int b) :fenzi(a), fenmu(b) {}
operator double()
{
return 1.0* fenzi / fenmu;
}
friend ostream& operator<<(ostream& os, Fraction&& obj)
{
os << obj.fenzi << "/" << obj.fenmu;
return os;
}
Fraction& operator++()
{
fenzi++;
fenmu++;
return *this;
}
Fraction operator++(int)
{
Fraction tmp(fenzi, fenmu);
fenzi++;
fenmu++;
return tmp;
}
};
int main()
{
Fraction a1(9, 11), a2(1, 2);
cout << double(a2) << endl;
cout << ++a1 << endl;
cout << a1++ << endl;
return 0;
}
我想知道为什么输出不同?
Fraction operator++()和Fraction& operator++(),前者返回复制的,后者返回原始的。但它们的类型都是Fraction。我认为它应该都叫ostream& operator<<(ostream& os, Fraction&& obj)。
分数运算符++() 输出(我预期):
0.5
10/12
10/12
分数和运算符++() 输出:
0.5
0.833333
10/12
【问题讨论】:
-
请包括实际和预期输出
-
不知道为什么你会感到困惑。您不能将左值引用传递给右值引用。
-
this 链接可能会回答您的问题。
-
如果你想让
++a1参数绑定到Fraction&&参数,这样做:cout << std::move(++a1) << endl;将左值转换为右值,可以绑定到右值参考。 -
总之Fraction&返回一个左值,Fraction返回一个右值,对吧?
标签: c++