2012-01-21 13 views
2

私は 、授業時間を作り、メインで宣言さ:does =コピーコンストラクタC++と同じ変数を宣言するときは?

time a; 
time b=a; 

が、これは同じです:

time b(a); 

??? は私も機能作ら:

time f(time t) 
{ 
    return t; 
} 

と宣言した後、メインでそれを使用する:コピーコンストラクタが呼び出されたとき、私は、メッセージを印刷し

time b=f(a); 

、結果はコンストラクタをコピーするだけで2呼び出し、1つのコピーAでした他のtは、返すためにtをコピーしています、ここで私の質問は、bから関数に返された値をコピーするコンストラクタをコピーする呼び出しがありませんでしたか?

ありがとうございます!

+0

これは簡単ですあなたのデフォルトのctor、ctorと代入演算子をコピーしてトレースを追加するかどうかを確認してください。 –

+0

@AndersK私はそれをしました。なぜ私は最後の質問をしましたか? – Khaledvic

答えて

2

あなたのヘッダーの質問とあなたの投稿の下の質問は異なります。あなたのヘッダーにあるもの:

does =変数を宣言するとき、コピーコンストラクタC++と同じですか?

正確ではありません。まず、右側の式が左側の型に変換され、コピーコンストラクタが呼び出されます。これには、暗黙の変換が必要です。可能でない場合、初期化はコンパイルされません。右側の式がすでに適切な型であれば、最初のステップは必要ありません。

その他の質問については、return value optimizationです。

0

いいえ、b = aは代入演算子(演算子=)を使用して新しい空白の時間オブジェクトを作成し、演算子を呼び出して値をそれに移動します。

多くの場合、コンパイラによって生成されたこのバージョンのコピーコンストラクタが呼び出されますが、これは必要ありません。

参考のため、explicitというキーワードを参照してください。オブジェクトのコピーは2つの方法(コピーctorと代入演算子)で行うことができるため、明示的に呼び出されたときにのみ暗黙的にコピーctorを使用するようにコンパイラに指示します。

すべての異なるコンストラクタ(新しいC++ 0x移動を含む)と代入演算子を使用してクラスを作成し、デバッガで実行したときの動作を確認します。

+0

これは間違っています。初期化に使用すると、 '='は 'operator ='ではありません。 –

+0

私たちはC++ 11を手に入れたので、 'operator ='が呼び出されると 'a'は動かず、' b'にコピーします。重要な違い。 – Grizzly

2

はい、time b = aは、オブジェクトを宣言して同時にその値を割り当てるため、time b(a)に相当します。

質問の2番目の部分については、コンパイラは一般に、最適化レベルに応じて不要なオブジェクトコピーをできる限り削除します。

0

オブジェクトが他のオブジェクトから作成されているとき、コピーコンストラクタが

時間Bと同様と呼ばれます=。 または時間b(a)。

が、オブジェクトがすでに作成され、あなたがそれに項目をコピーしたい場合は、オペレータが= は違いは、あなたがコピーコンストラクタを使用する場合は、動的に割り当てられたメモリ を使用しているときのようなものであることを

と呼ばれていますあなたがまだ作成されていないことを意味するので、メモリ管理のクリーンアップは不要です。

オブジェクトを別のオブジェクトに割り当てるときは、まず空きメモリのような動的に割り当てられた要素、それ自身をコピーしてください

関連する問題