1

次のメソッドを持つクラス Student があるとします。

Student Student::method(Student x)
{
    //nothing important
    return x;
}

コピー コンストラクターは、オブジェクト x がパラメーターとして送信されるときに 1 回、関数から x が返されるときに 2 回呼び出されます。

このメソッドを呼び出すと、クラス Student のデストラクタが 2 回呼び出されるのはなぜですか? 呼び出しは次のようになります: a = b.method(c)、ここで、a、b、および c は Student オブジェクトです。

4

3 に答える 3

3

あなたの例ではa = b.method(c);、コピーの省略を除いて、実行される可能性のある 3 つのコピーがあります。1 つ目は、cオブジェクトが関数パラメーターにコピーされるときxです。2 つ目は、xオブジェクトが関数から返されたときです。3 つ目は、戻り値がaオブジェクトにコピーされるときです。最初の 2 つはコピー コンストラクターに関係し、最後の 2 つにはコピー代入演算子が関係しますStudent a = b.method(c);

ab、およびcすべてのスコープの最後に破棄されます。オブジェクトxは関数の最後で破棄されmethodます。関数の戻り値は、それを含む完全な式の最後で破棄されます。つまり、終了すると破棄されa = b.method(c);ます。

ただし、これらのコピーのすべてが発生する必要はありません。コンパイラは、特定の状況下でクラスのコピー/移動構築を省略または省略できます。関数パラメーターへの最初のコピーが発生します。関数からの 2 番目のコピーは、コピーを試みる前に最初に移動として扱われます。このコピーまたは移動は省略される場合があります。コピー代入を使用している場合は、一時的な戻り値から への最終コピーaが発生しますが、コピー コンストラクターを使用している場合は省略される可能性があります (のようにStudent a = b.method(c);)。

于 2013-01-29T11:52:07.263 に答える
1

2 つの Student オブジェクトが構築されている場合は、それらを破棄する必要があります。パラメータへのコピーと戻り値からのコピーは破棄する必要があります。

于 2013-01-29T11:39:36.120 に答える
1

のデストラクタxは、関数が戻るときに呼び出されます (x戻り値にコピーされた後)。

戻り値のデストラクタは、関数呼び出しを含む完全な式の最後で呼び出されます (戻り値の有効期間が参照に割り当てられることによって延長されない限り)。

構築された自動保存期間を持つすべてのオブジェクトは、自動的に破棄されます (通常は構築の逆順)。2 つのオブジェクト (xおよび戻り値) を構築するため、2 つのデストラクタ呼び出しがあります。

于 2013-01-29T11:39:45.407 に答える