C ++通过引用返回本地对象[重复]

Posted

技术标签:

【中文标题】C ++通过引用返回本地对象[重复]【英文标题】:C++ return a local object by reference [duplicate] 【发布时间】:2017-10-01 09:53:22 【问题描述】:

我知道这个问题已经被问了好几(百万)次了,但我不明白接下来的内容:

如果我有这样的功能:

Object &function()

    Object obj;
    return obj;

以及调用它的客户端代码:

Object newObject = function();

我通过引用含义返回 obj ,这很糟糕,因为该对象一旦超出范围就会被销毁(在终止大括号之后)。但是我将该本地对象传递给调用站点的新对象,所以我不应该安全吗?当对象消失时,不应该(通过其复制构造函数)复制对象吗?我知道将指针传递给非本地对象是不好的,因为我正在传递(按值)指针的位置,一旦(本地)指针超出范围(堆栈帧消失),该位置将指向垃圾,但是为什么引用?代码不一样吗:

Object &temp = obj;
Object newObject = temp;

?请解释一下。

编辑上面的问题不是问同样的事情。我完全理解为什么我不应该返回指向本地的指针,以及为什么我不应该返回对本地的引用来初始化调用站点的引用。我不明白为什么我不能使用对本地的引用来初始化调用站点的对象。我觉得没那么简单。

【问题讨论】:

区别在于第二个例子,obj在你创建newObject时仍然存在。在第一个示例中,obj 在您创建 newObject 之前已停止存在。该函数在结果分配给newObject之前完全返回并清除它的变量。 不,因为对象在函数返回之前被销毁,而在函数返回之前无法完成。 另一个问题是问完全相同的事情 - 再次检查。它询问为什么不能返回引用,而你说'但是如果我确实返回它,我能用它做什么? 【参考方案1】:

不,正如你自己所说,这不安全。

无论您如何处理对现在已销毁对象的无效引用,这都是正确的。

复制太晚了。

【讨论】:

所以我不能在对象消失之前说“保存”它吗? @Luca 是的,您可以通过返回值而不是引用来实现。这几乎就是按价值返回的意思。 这正是按值返回的意思。 @Luca:如果你担心的是多余的复制。不要这样。编译器支持您。 ***.com/questions/12953127/…

以上是关于C ++通过引用返回本地对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过字符串创建代表c ++中类名的新对象[重复]

c ++ * vs&在函数声明中[重复]

通过引用传递对象[重复]

在c / c ++中何时通过引用传递以及何时通过值传递[重复]

怎么用JS把特定字符串重复的字符删除留下一个

“对象引用未设置为对象的实例”我遇到了这个错误,我不知道为啥[重复]