常量引用不被“更新”

4

我知道这可能是一个常见的问题,并且我以前在SO上看到过类似的问题。我正在尝试理解"通过const引用返回"的东西。我似乎陷入了这个看起来简单的例子中:

#include <iostream>
using namespace std;

class Test {
public:
  int x;

  Test(): x(0) {};

  const int& getX() const {
    return x;
  }
};

int main() {
  Test t;
  int y = t.getX();
  cout << y << endl;
  t.x = 1;
  cout << y << endl; // why not 1?
}

我知道通过 const int& 返回可以防止我使用类似 y=1 的方法设置 t.x,这很好。然而,我期望在最后一行 y 为 1,但它仍然是零,就像 getX() 返回一个普通的 int 一样。这里到底发生了什么?


1
y本身只是从getX()复制而来,这并不使y成为一个引用。因此你的期望是错误的。 - πάντα ῥεῖ
2个回答

8

当你返回引用时,你将结果存储在一个新的整数y中,这与成员x从这一点上没有任何关系。它只是t.x的副本,在初始化后的值不会依赖于t.x的值或存在状态。

使用引用来观察您期望的行为:

#include <iostream>
using namespace std;

class Test {
public:
  int x;

  Test(): x(0) {};

  const int& getX() const {
    return x;
  }
};

int main() {
  Test t;
  const int &y = t.getX();
  cout << y << endl;
  t.x = 1;
  cout << y << endl; // Will now print 1
}

3

如果您希望更新返回的const引用,请将其分配给const int & y,而不是int变量。否则它将被复制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接