【问题标题】:Why is object member value changing between 2 getter calls为什么对象成员值在 2 个 getter 调用之间发生变化
【发布时间】:2022-01-03 16:28:20
【问题描述】:

我在第二次 getter 调用中获得了意想不到的价值,这对我来说看起来不对,发生这种情况有什么具体原因吗?

#include<iostream>

using namespace std;

class Test {

public:
    int &t;
    Test (int x):t(x) { }
    int getT() { return t; }
};

int main() {
    int x = 20;
    Test t1(x);
    cout << t1.getT() << " ";
    cout << t1.getT() << endl;

        
    return 0;
}

【问题讨论】:

  • 成员t 引用了本地范围的参数x不是main 中定义的x。所以你有未定义的行为。
  • @G.M.对,但它不应该在第一次调用本身时给出随机值吗?因为该范围是直到构造函数调用?
  • 未定义的行为——你不能期待任何事情。
  • @HemantKr 未定义行为就是这样,未定义。你可以得到任何输出,或者根本没有输出,你无法以任何方式预测或依赖它。
  • 你能分辨出随机 20 和非随机 20 的区别吗?

标签: c++ constructor pass-by-reference pass-by-value


【解决方案1】:

这里的问题是您的代码会导致未定义的行为。

Test 的构造函数不引用一个 int 而是一个副本,并且由于 int x 只是一个临时副本,它不能保证在您的第二个函数调用之前存在,您最终会出现未定义的行为.

您必须将构造函数更改为以下内容才能使代码正常工作:

Test(int& x) : t(x) {}

现在您在Test 中使用的引用将与main 中定义的x 相同

【讨论】:

  • 一直到第一次函数调用时它是如何存活的
  • @HemantKr 不是。第一次调用也是一个UB,你从x中看到你的价值只是一个巧合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多