我之前曾问过类似的问题(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
最佳答案
operator double()
{
return 1.0* fenzi / fenmu;
}
是隐式转换运算符。在
explicit
中添加operator double()
关键字将对此有所帮助,因为在不显式将其转换为Fraction
的情况下,编译器不会将double
隐式转换为double
。附加内容如下所示:explicit operator double()
{
return 1.0* fenzi / fenmu;
}
正确的输出流运算符定义为
friend ostream& operator<<(ostream& os, Fraction& obj)
。您将其定义为friend ostream& operator<<(ostream& os, Fraction&& obj)
Fraction&&
是一个右值引用,而不是一个左值引用(Fraction&
)。编译器使用了隐式转换运算符,因为operator++
(在任一定义中)都返回左值(引用),而不是右值引用,后者被定义为输出流运算符的参数。关于c++ - 为什么我添加一个 “&”,它输出不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56132105/