下面的给定程序打印x= 10 y=0
#include<iostream>
using namespace std;
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;
obj1.setX(10).setY(20);
obj1.print();
return 0;
}但如果我们替换掉
Test setX(int a) { x = a; return *this; }
Test setY(int b) { y = b; return *this; }使用
Test &setX(int a) { x = a; return *this; }
Test &setY(int b) { y = b; return *this; }输出是x= 10,y= 20,谁能解释为什么会发生这种情况?
发布于 2012-09-15 21:34:56
当您返回普通对象而不是引用时,您返回的是调用该方法的对象的副本。setY作用于该拷贝(这是一个临时拷贝),然后该拷贝被销毁。
当你返回一个引用时,所有的调用都在同一个对象上操作,所以你得到了你想要的行为。
发布于 2012-09-15 21:35:04
第一次调用setX()会返回一个obj1的临时副本,而对setY()的调用会修改这个临时副本。随后对print()的调用将显示obj1的状态,并且由于在obj1中y成员变量从未修改过,因此它仍然为零。
当您将返回类型替换为引用时,不会创建临时副本,因为对setX()和setY()的调用都在obj上操作。
发布于 2012-09-15 21:54:41
让我们回到面向对象编程的基础上。
让我们用一个比喻--比方说公交车。
公交车的某些属性是可以改变的--例如燃料。
因此,如果你有一个功能(加满油),你就不需要一辆与上一辆完全相同的新公交车,因为它的油箱已经满了。
因此,回到最初的问题。
Test setX(int a) { x = a; return *this; }应该阅读
void setX(int a) { x = a; }等。
你有相同的物体,但是燃料可能加满了(在这种情况下是x)。
https://stackoverflow.com/questions/12437791
复制相似问题