2013-06-16 9 views
7
class Foo 
    { 


    }; 

    Foo f; 
    Foo g = f; // (*) 

私の質問は、(*)と記されている行で何が呼び出されていますか? デフォルトのコピーctrまたは '='演算子ですか?コンストラクタまたは=演算子をコピーしますか?

+0

この場合、「default copy ctr」は誤った名前です。 C++では、 "defualt constructor"という用語には特別な、厳密に定義された予約された意味があります。これはコピーコンストラクタとは関係ありません。この場合、 "* compiler-supplied * copy constructor"や "* implicit * copy constructor"などと呼ばれます。しかし、そのコピーコンストラクタは確かに "*デフォルト*コンストラクタ"ではありません。 – AnT

答えて

8

私の質問は、(*)の付いた行に何が表示されていますか?それはデフォルトのコピーctrまたは '='演算子ですか?

コピーコンストラクタが呼び出されます。

=符号が使用されているにもかかわらず、これは左側のオブジェクトをコンストラクタへの引数として右側の式を供給することにより構成されて初期、の場合です。

特に、初期化のこの形式は、コピー初期化と呼ばれます。初期化子式の型(この場合Foo)初期化クラスオブジェクトのタイプと同じである場合、コピーの初期化は、基本的直接初期化、すなわち、と等価であることに注意してください:

Foo g(f); // or even Foo g{f} in C++11 

微妙な違いは、Fooのコピーコンストラクタがexplicitとマークされていると(なぜそうであるか想像がつきにくい)、コピー初期化の場合はオーバーロードの解決に失敗するということです。

1
Foo g = f; // (*) 

コピーコンストラクタが呼び出されます。オブジェクトのコピー初期化と呼ばれます。

クラスFooでコピーコンストラクタを記述していない場合、コンパイラによって生成されたコピーコンストラクタが呼び出されます。

2

gは実際にはfのコピーとして作成されます。

実際に何を意味するかを簡単に覚えておくには、質問に答えてください:gは既に存在していますか?

{ 
    Foo g; //g construction ends here (at ';') 
    g = f; // assignment (the g previous value is replaced) 
} 

{ 
    Foo g = f; //copy (same as Foo g(f): there is no "previous g" here) 
} 
+0

g = fの場合は、それが「=」演算子の使用であり、コピーctrの権利ではないことを意味していますか? –

+0

;それはgがすでに存在し、真上に宣言されているからです。 –