web-dev-qa-db-ja.com

C ++のコピーコンストラクターは、オブジェクトが関数から返されたときに呼び出されますか?

コピーコンストラクターが3つのインスタンスで呼び出されることを理解しています

  1. 1つのオブジェクトをインスタンス化し、別のオブジェクトの値で初期化する場合。
  2. オブジェクトを値で渡す場合。

。オブジェクトが値によって関数から返される場合。

オブジェクトの値が返されたときにコピーコンストラクターが呼び出された場合、オブジェクトが関数内でローカルに宣言されている場合に問題が発生するのではないでしょうか。

つまり、コピーコンストラクターはディープコピーコンストラクターであり、オブジェクトの参照をパラメーターとして受け取ります

25
Kazoom

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

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

17
sharptooth

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

呼び出された関数は、戻り値が占めるメモリにアクセスできますが、コピーが作成されているときにそのメモリが「スコープ内」にない場合でも、そのメモリは使用できます。

13
unwind

回答 によると、私の質問へのコピーコンストラクターは2回呼び出すこともできます:ローカルオブジェクトを'object'を返し、戻りオブジェクトを割り当てられた変数にコピーします。

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

5
xtofl

いいえ、ローカルが破壊される前に呼び出します。これは、破棄とコピーの構築をログに記録するオブジェクトを使用して、または生成されたアセンブリコードを調べることでテストできます。

0
Lou Franco