0

我正在阅读以下问题:

如何在 C++ 中“返回一个对象”?

(询问有关在 C++ 中返回对象的问题)

特别是以下答案:

https://stackoverflow.com/a/3350418/997112

Thing calculateThing() {
    Thing thing;
    // do calculations and modify thing
     return thing;
}

这个答案肯定不会起作用,因为定义的变量将不再存在,因为它在堆栈上并且仅在函数持续时间内的范围内?

4

3 回答 3

1

它会起作用,因为(至少在语义上),您将变量的副本返回给调用者。现在,实际的副本可能会通过返回值优化被省略,所以在这种表达式中

Thing t = calculateThing();

来自函数体的thingthe 通常会被构造到t. 但t实际上是一个副本,thing因为它具有相同的价值。

于 2013-03-10T21:22:10.477 回答
1

thing函数的内部将在返回后销毁,但它会被复制到Thing调用方的另一个对象。

Thing new_thing = calculateThing();

new_thingthing具有从中返回的内容calculateThing

注意:有一个棘手的问题,我假设有明确定义的复制构造函数或赋值运算符newdelete 以防Thing.

更新: 正如 juanchopanza 评论的那样,RVO将避免thing在该函数内创建。实际上new_thing将被thing隐式替换,并且不会完成额外的副本。显然不会发生破坏。

于 2013-03-10T21:23:34.873 回答
0

这是有效的,因为thing它被复制/移入返回值(返回值是不同的对象,thing除非发生复制省略,在这种情况下,生命周期thing会延长到返回值的生命周期)。

//Here there may be up to three Thing objects.
//- `thing` in the function body
//- the unnamed temporary that is the value of `calculateThing()`
//  (the return value)
//- t
Thing t(calculateThing());

如果发生复制省略,所有三个对象可能是同一个对象。

于 2013-03-10T21:22:45.063 回答