为什么在更改函数返回类型时,c ++代码的输出会发生变化?

时间:2015-06-01 07:24:47

标签: c++

class Test
{
private:
  int x;
  int y;
public:
  Test(int x = 0, int y = 0) { this->x = x; this->y = y; }
  Test &setX(int a) { x = a; return *this; }
  Test &setY(int b) { y = b; return *this; }
  void print() { cout << "x = " << x << " y = " << y << endl; }
};

int main()
{
  Test obj1(5, 5);
  obj1.setX(10).setY(20);
  obj1.print();
  return 0;
}

上面的代码输出为10 20,但是当我更改返回类型时 Test &setXTest setXTest &setYTest setY,输出更改为10 5。任何人都可以解释相同的原因吗?这不是任务分配或与家庭作业有关的任何事情。

4 个答案:

答案 0 :(得分:6)

关于临时对象。

在没有返回引用的版本中,即返回类型为Test 您的代码等同于

Test obj1(5, 5);
Test temp1 = obj1.setX(10);
Test temp2 = temp1.setY(20);
// temp2 will have x = 10 and y = 20, but the object is discarded
obj1.print();

如您所见,在临时对象上调用setY(20),并且丢弃返回的值。因此,只有第一个setX(10)实际修改obj1

另一方面,如果您返回引用,即返回类型为Test &,则不会创建临时类型。因此,setX(10)setY(20)都会影响原始对象(obj1),因为该方法是在同一个对象上调用的。

答案 1 :(得分:4)

在返回值(而不是引用)的下一行中,最终让obj1.setX(10)返回一个新对象。在这个新对象(将被丢弃)上调用setY但原始文件保持不变

obj1.setX(10).setY(20);

答案 2 :(得分:1)

当您将Test &setX(int a)更改为Test setX(int a)时,函数Test setX(int a)会返回一个新对象。 obj1.setX(10).setY(20)等于以下内容:

  Test newobj = obj1.setX(10);
  newobj.setY(20);

  obj1.print();      // 10, 5
  newobj.print();    // 10, 20

答案 3 :(得分:0)

如果你定义

obj1.setX(10);
obj1.setY(20);

结果总是10和20.