2009-03-20 21 views
20

私は1つのオブジェクトをインスタンス化し、他のオブジェクトからの値で初期化するとコピーコンストラクタは、3つのインスタンスCopy C++のコンストラクタは、オブジェクトが関数から返されたときに呼び出されますか?

  1. に呼ばれて理解しています。
  2. 値でオブジェクトを渡すとき。

3.オブジェクトが値によって関数から返されたとき。

オブジェクトの値が返されたときにコピーコンストラクターが呼び出された場合は、no.3の質問があります。オブジェクトが関数内でローカルに宣言されていれば、問題は発生しません。

iは、コピーコンストラクタが深いコピー一つであり、地元の人々が破壊される前に、いや、それはそれを呼び出す

+3

C++標準では、コンパイラが特定の場合にコピーを最適化することができるため、コピーコンストラクタが呼び出されることは保証されていません。特に[戻り値の最適化](http:// en .wikipedia.org/wiki/Return_value_optimization) – rmp251

+0

@ rmp251によって指摘された参照は、この質問に明確に答えています。 –

答えて

15

これは問題を避けるために正確に呼ばれています。結果として機能する新しいオブジェクトは、ローカルで定義されたオブジェクトから初期化され、ローカルに定義されたオブジェクトは破棄されます。

ディープコピーのユーザー定義コンストラクタの場合は、すべて同じです。結果として機能するオブジェクトに最初のストレージが割り当てられ、コピーコンストラクタが呼び出されます。渡された参照を使用してローカル定義のオブジェクトにアクセスし、新しいオブジェクトに必要なものをコピーします。

0

パラメータとしてオブジェクトの参照を取る意味します。破壊やコピーの作成を記録するオブジェクト、または生成されたアセンブリコードを調べることで、これをテストできます。

+0

しかし、コピーコンストラクタがパラメータ(ディープコピー)として参照を取る場合、オブジェクト全体をコピーしないでしょうか? – Kazoom

+0

コピーコンストラクタによって異なります。デフォルトのものは、メンバー単位のコピー構成を行います。通常は、コピーコンストラクタを実装して、渡されたオブジェクトの存続期間に依存しないようにする必要があります。ディープコピーは必要ありませんが、共有されたものが残っていることを確認する必要があります。 –

11

コピーは、呼び出された関数が終了する前に実行され、そのときは既存のローカル変数を戻り値にコピーします。

呼び出された関数は、コピーが行われているときにそのメモリが「有効範囲内」ではないにもかかわらず、戻り値が占有するメモリにアクセスできます。

+0

私は、オブジェクトの値が返されるとき、最初にコピーコンストラクタを呼び出しますが、コピーコンストラクタはユーザ定義であると理解しています。パラメータとして参照をとります。ClassA(const ClassA&) uが値の代わりに参照を返す場合はどうなるのですか? – Kazoom

+0

関数がローカル変数への参照を返す参照を返すと宣言されている場合は、それを行うことはできません。関数の復帰時に破棄されるオブジェクトへの参照を返します。このリファレンスを使用すると問題が発生する可能性があります。 – sharptooth

+0

はい私はそれを理解しているので、パラメータを参照しているコピーコンストラクタが値を返すときに呼び出されているときはどうなりますか?それはあまりにもクラッシュしないでください? – Kazoom

4

私の質問へan answerによると、コピーコンストラクタも二回呼び出すことができます。return「オブジェクト」にローカルオブジェクトをコピーすると、一度それが割り当てられた変数に戻りオブジェクトをコピーします。

ただし、である必要はありません。コンパイラは、両方のコピー構成を最適化できます。

+2

私はあなたに同意しません。コピーコンストラクタは、返されたオブジェクトに対して1回だけ呼び出されました。返されたオブジェクトを別の外側スコープオブジェクトに割り当てると、コピーコンストラクタではなく代入演算子が呼び出されます。 –

-1

コピーコンストラクタが呼び出される三つの一般的な場合があります

  1. つのオブジェクトをインスタンス化し、(同じタイプの)他のオブジェクトからの値でそれを初期化します。
  2. 値でオブジェクトを渡すとき。
  3. オブジェクトが値によって関数から返されたとき。
関連する問題