首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >令人困惑的输出

令人困惑的输出
EN

Stack Overflow用户
提问于 2012-09-15 21:32:22
回答 5查看 572关注 0票数 2

下面的给定程序打印x= 10 y=0

代码语言:javascript
运行
复制
#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;
}

但如果我们替换掉

代码语言:javascript
运行
复制
Test setX(int a) { x = a; return *this; }
Test setY(int b) { y = b; return *this; }

使用

代码语言:javascript
运行
复制
Test &setX(int a) { x = a; return *this; }
Test &setY(int b) { y = b; return *this; }

输出是x= 10,y= 20,谁能解释为什么会发生这种情况?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-15 21:34:56

当您返回普通对象而不是引用时,您返回的是调用该方法的对象的副本。setY作用于该拷贝(这是一个临时拷贝),然后该拷贝被销毁。

当你返回一个引用时,所有的调用都在同一个对象上操作,所以你得到了你想要的行为。

票数 4
EN

Stack Overflow用户

发布于 2012-09-15 21:35:04

第一次调用setX()会返回一个obj1的临时副本,而对setY()的调用会修改这个临时副本。随后对print()的调用将显示obj1的状态,并且由于在obj1y成员变量从未修改过,因此它仍然为零。

当您将返回类型替换为引用时,不会创建临时副本,因为对setX()setY()的调用都在obj上操作。

票数 2
EN

Stack Overflow用户

发布于 2012-09-15 21:54:41

让我们回到面向对象编程的基础上。

让我们用一个比喻--比方说公交车。

公交车的某些属性是可以改变的--例如燃料。

因此,如果你有一个功能(加满油),你就不需要一辆与上一辆完全相同的新公交车,因为它的油箱已经满了。

因此,回到最初的问题。

代码语言:javascript
运行
复制
Test setX(int a) { x = a; return *this; }

应该阅读

代码语言:javascript
运行
复制
void setX(int a) { x = a; }

等。

你有相同的物体,但是燃料可能加满了(在这种情况下是x)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12437791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档