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();

thing関数本体の は、通常、 の場所に構築されますt。しかし、同じ値を持つという意味では、t実質的に のコピーです。thing

于 2013-03-10T21:22:10.477 に答える
1

そのthing関数内はリターン後に破棄されThingますが、呼び出し側で別のオブジェクトにコピーされます。

Thing new_thing = calculateThing();

new_thingthingから返された の内容を持っていますcalculateThing

注: 注意が必要な点があります。 have new/ delete stuffs inの場合、適切に定義されたコピー コンストラクターまたは代入演算子があると仮定しThingます。

更新: juanchopanza がコメントしたように、RVOはその関数内での作成を回避thingします。実際new_thingには暗黙的に置き換えられthing、余分なコピーは行われません。明らかに破壊は起こりません。

于 2013-03-10T21:23:34.873 に答える
0

これは、 が戻り値にコピー/移動されるため機能します (コピーの省略が行われない限りthing、戻り値は別のオブジェクトです。その場合、有効期間は戻り値の有効期間まで延長されます)。thingthing

//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());

コピー省略が発生した場合、3 つのオブジェクトはすべて同じオブジェクトである可能性があります。

于 2013-03-10T21:22:45.063 に答える