Codepad.org c++代码给出错误的结果

Codepad.org C++ code gives wrong result

本文关键字:错误 结果 出错 org c++ 代码 Codepad      更新时间:2023-10-16

有个小问题:

你能告诉我这段代码有什么问题吗?它应该输出9,但是它输出了4.8921e-270,然而,当取消注释第4行时,它也工作得很好。
我不明白这是怎么回事。谢谢!

代码:

double& foo() {
  double x = 9;
  double &y = x;
  //cout << y << "n";
  return y;
}
int main() {
  cout << foo() << "n";
}

结果:4.8921e-270

返回指向堆栈上对象的引用/指针是坏的主意。当您离开函数时,它们可能会被破坏。试着按值返回:

double foo() {
  double x = 9;
  double &y = x;
  //cout << y << "n";
  return y;
}

现在返回值是复制的而不是一个可能已经不存在的对象的引用。

您正在返回对本地对象的引用,当foo完成时该对象不再存在,然后当您取消引用它时,您将获得未定义行为

double foo() {
  double x = 9;
  double &y = x;
  //cout << y << "n";
  return y;
}

返回对堆栈上对象的引用从来都不是一个好主意。当你离开函数时,它们很可能就消失了。您可以尝试按值返回。

返回对局部变量的引用-由于局部变量在foo()返回时超出了作用域,因此该值不再存在。

因此,您应该将返回类型更改为double(强烈建议)并返回x,或者(如果您绝对想要/必须返回引用)使用静态变量代替:

double& foo() {
  static double x = 9;
  double &y = x;
  return y;
}

我通常通过const ref:

返回类的数据成员
class BigThing {...};
class Foo
{
public:
   const BigThing & getBT() const { return bt; } // For constant BigThing.
   BigThing & getBT() { return bt; } // For mutable BigThing.
private:
   BigThing bt;
};

那么只要你的Foo实例在作用域中(你不想返回一个ref到一个局部变量),那么使用getBT()应该是安全有效的。