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 &setX
到Test setX
和Test &setY
到Test setY
,输出更改为10 5
。任何人都可以解释相同的原因吗?这不是任务分配或与家庭作业有关的任何事情。
答案 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.