只是一个小问题:
您能告诉我this代码中的问题是什么吗?它应该打印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
答案 0 :(得分:8)
将强引用/指针返回到堆栈上的对象是一个错误的想法。当你离开这个功能时,它们很可能会被破坏。尝试按值返回:
double foo() {
double x = 9;
double &y = x;
//cout << y << "\n";
return y;
}
现在返回值已复制,而不是对可能不再存在的对象的引用。
答案 1 :(得分:4)
您正在返回对本地对象的引用,该对象在foo
完成时不再存在,然后在您取消引用时获得未定义的行为。
答案 2 :(得分:1)
double foo() {
double x = 9;
double &y = x;
//cout << y << "\n";
return y;
}
永远不要在堆栈上返回对象的引用。当你离开这个职能时,他们很可能会消失。您可以尝试按值返回。
答案 3 :(得分:0)
返回对局部变量的引用 - 因为foo()返回后局部变量超出范围,该值不再存在。
所以你应该只是将返回类型更改为double(强烈推荐)并返回x或(如果你绝对想要/必须返回引用)使用静态变量:
double& foo() {
static double x = 9;
double &y = x;
return y;
}
答案 4 :(得分:0)
我经常通过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()之一应该是安全且有效的。