我之前曾问过类似的问题(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/

10-11 23:19