在C ++中,为什么我使用或不使用引用作为结果值得到不同的结果?

时间:2017-08-31 19:41:10

标签: c++ c++11 reference

class point
{
private:
    double x,y;
public:
    point(double x=0.0, double y=0.0)
    {
        this->x=x;
        this->y=y;
    }

    point operator++()
    {
        this->x=this->x+1.0;
        this->y=this->y+1.0;
        return *this;
    }

    point& operator++(int)
    {
        point p=point(this->x, this->y);
        ++(*this);
        return p;

    }

    ostream& operator<< (ostream& o)
    {
        o << "X: " << this->x << endl << "Y: " << this->y;
        return o;
    }

    friend ostream& operator<< (ostream& o,point p)
    {
        o << "X: " << p.x << endl << "Y: " << p.y;
        return o;
    }
};


int main()
{
  point p = point();
  p++ << cout << endl; // first output
  cout << p++ << endl;// second output
}

我不明白为什么第一个输出不正确(X:6.95333e-310 Y:6.95322e-310),而第二个输出是正确的(X:1 Y:1)。

为什么通过在后增量运算符的返回值的末尾删除&来解决此问题?

1 个答案:

答案 0 :(得分:4)

当您返回对局部变量的引用时,使用该引用是未定义的行为。

您的编译器应该警告您。如果不是,请提高编译器警告级别,并注意警告。

point& operator++()
point operator++(int)

是正确的返回值。

其余代码似乎正常。

我会删除using namespace std;,并将++的实现更改为:

    ++x;
    ++y;
    return *this;