返回本地字符串对象的引用

3
string& GetMyStr(string& somestr)
{
   string & str=somestr;
   //do something with str
   return str;
}

str是一个本地对象,但为什么在返回后我仍然可以获取其值?我认为在函数返回后,它也应该消失并且返回值没有被引用。我想我可能错了。

4个回答

8
因为你返回的是一个存在于函数外部的参数的引用。你通过引用方式接收了参数somestr,然后使str指向该对象,所以str不是一个本地对象,而是对调用者传递给函数的对象的引用。
这将创建对传入参数的引用:
string & str=somestr;

然后你将它作为引用返回。与此同时,对 str 所做的任何操作都是针对 somestr 进行的,因此调用者的参数会被修改。

如果您打印传递给 GetMyStr 的参数,然后打印该调用的返回值,您会发现字符串相同(或者您可以比较地址,这些也将是相同的)。


谢谢,但是如果我把它改成 string str=somestr;,这不再是一个引用了,对吧?或者当传递的参数不是引用时,在我的编译器上仍然可以工作。 - Baby Dolphin
这是正确的,但你最终会遇到未定义的行为,因为你返回了一个生命周期已经结束的对象的引用。这可能会因为纯粹的运气而起作用,但并不保证。 - templatetypedef
@Baby 是的,没错,它不再是一个引用了。如果你尝试在 string str=somestr; 时返回对 str 的引用,那么它将被销毁,因为你返回了一个指向本地对象的引用。 - Seth Carnegie

1

somestr 是一个引用,因此它指向了一个在 GetMyStr 范围之外的对象。因此,在 GetMyStr 返回后,它仍然存在,可以安全地使用它。如果 somestr 不是一个引用,那么情况会大不相同,因为你将返回一个对象的副本(一个局部变量)的引用。


1
“str”是一个本地对象吗?
不是的。 “str”的类型是“string&”,因此它是一个引用。特别地,它引用了通过引用传递的“somestr”,也就是调用者的字符串。这显然在函数返回后仍将存在。

0

我想我在下面提到的主题中问了一个类似的问题。你可以看一下这个。几分钟后,对我来说变得很清楚! :) (虽然我正在讨论指针,但没有其他令人困惑的地方:D)

指针 - 在C++中返回本地引用


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