2017-05-03 90 views
-3

返回本地对象我知道,这个问题已经被问了好几个(万元)次,但我不明白如下:c + +参考

如果我有这样一个功能:

Object &function() 
{ 
    Object obj; 
    return obj; 
} 

,并调用它的客户端代码:

Object newObject = function(); 

我被借鉴意义返回OBJ因为该对象只要它超出范围(后终止大括号)销毁的是坏的。但是我将该本地对象传递给调用站点上的一个新对象,所以我不应该安全吗?不应该在对象被复制时(通过它的拷贝构造函数)在它不在时?我知道传递一个指向alocal对象的指针是不好的,因为我传递(通过值)指针的位置,一旦(本地)指针超出作用域(堆栈框架消失)就会指向垃圾,但为什么引用?是不是代码相同:

Object &temp = obj; 
Object newObject = temp; 

?请解释。

编辑上面的问题不是要求同样的事情。我完全理解为什么我不应该返回一个指向本地的指针,为什么我不应该返回一个引用到本地来在调用网站初始化引用。我不明白的是为什么我无法使用对本地的引用来在呼叫站点初始化对象。我不认为这是如此微不足道。

+1

区别在于第二个例子,当你创建'newObject'时,'obj'仍然存在。在第一个例子中,在创建'newObject'之前'obj'已经停止了。该函数在结果赋给'newObject'之前完全返回并清除它的变量。 –

+0

这听起来像你需要参考[The Definitive C++ Book Guide and List](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 –

+0

不,因为在函数返回之前,对象被销毁*,而在它返回之前无法完成。 –

回答

1

不,如你所说,这是不安全的。

无论你如何处理now-invalid引用现在被销毁的对象,这都是真的。

复制它为时已晚。

+0

所以我不能说让它“保存”它在它消失之前? – Luca

+1

@Luca是的,你可以通过返回一个值而不是参考。这几乎是通过价值手段返回的东西。 – Angew

+0

这正是通过价值返回的意思。 –