1

私は2つのコピーコンストラクターを持っています

Foo(Foo &obj){

}
Foo(Foo *obj){

}

2番目のコピーコンストラクターはいつ呼び出されますか?

4

4 に答える 4

10

いいえ、そうではありません - コピー コンストラクターが 1 つあります。

Foo( Foo * obj );

はコピー コンストラクターではなく、C++ コンパイラによってコピー コンストラクターとして使用されることはありません。もちろん、自分で使用することもできます:

Foo a;
Foo b( & a );   // use your constructor

実際のコピー コンストラクターは次のように宣言する必要があることにも注意してください。

Foo( const Foo & f );

ただし、const がないからといって、コピー コンストラクターになることを妨げられるわけではありません。

于 2010-03-22T11:30:42.523 に答える
5

2 番目のコンストラクターがコピー コンストラクターではないことは別として、実際には 2 番目のコンストラクターが呼び出されるタイミングを知りたいと思っていました。

Foo(Foo* obj);コンストラクターは単一パラメーターのコンストラクターです。キーワードでマークされていないため、からへexplicitの暗黙的な変換を提供します。a がorの代わりに使用されている場合はいつでも呼び出される可能性があります。Foo*FooFoo*Fooconst Foo&

一般に、単一パラメーターのコンストラクターは、コピー コンストラクター (他の回答で説明されています) にするか、マークする必要がありますexplicit。暗黙的な変換を提供するコンストラクターは慎重に使用する必要があります。

于 2010-03-22T12:03:31.833 に答える
2

2 番目はコピー コンストラクターではありません。これは、新しい Foo オブジェクトを作成するときに呼び出され、Foo へのポインターをパラメーターとして渡すコンストラクターです。

Foo foo0;
Foo foo1 = foo0;  // Calls copy constructor
Foo foo2(foo0);   // Calls copy constructor
Foo foo3(&foo0);  // Calls constructor taking a pointer as parameter
于 2010-03-22T11:33:11.237 に答える
2

コンストラクターの 1 つはコピー コンストラクターで、もう 1 つは単なる通常のコンストラクターです。

Foo2 つ目は、ポインタから aを明示的に初期化する場合、または引数の受け渡しや関数の戻り値など、ポインタから右辺値へFooの変換が必要なその他の状況で呼び出されます。FooFoo

通常、このような暗黙的な変換を行うことはお勧めできません。予期しないときに発生する可能性があり、コンパイルエラーによる些細なタイプミスが実行時の異常な動作に変わる可能性があります。

于 2010-03-22T11:33:23.110 に答える