私は2つのコピーコンストラクターを持っています
Foo(Foo &obj){
}
Foo(Foo *obj){
}
2番目のコピーコンストラクターはいつ呼び出されますか?
私は2つのコピーコンストラクターを持っています
Foo(Foo &obj){
}
Foo(Foo *obj){
}
2番目のコピーコンストラクターはいつ呼び出されますか?
いいえ、そうではありません - コピー コンストラクターが 1 つあります。
Foo( Foo * obj );
はコピー コンストラクターではなく、C++ コンパイラによってコピー コンストラクターとして使用されることはありません。もちろん、自分で使用することもできます:
Foo a;
Foo b( & a ); // use your constructor
実際のコピー コンストラクターは次のように宣言する必要があることにも注意してください。
Foo( const Foo & f );
ただし、const がないからといって、コピー コンストラクターになることを妨げられるわけではありません。
2 番目のコンストラクターがコピー コンストラクターではないことは別として、実際には 2 番目のコンストラクターが呼び出されるタイミングを知りたいと思っていました。
Foo(Foo* obj);
コンストラクターは単一パラメーターのコンストラクターです。キーワードでマークされていないため、からへexplicit
の暗黙的な変換を提供します。a がorの代わりに使用されている場合はいつでも呼び出される可能性があります。Foo*
Foo
Foo*
Foo
const Foo&
一般に、単一パラメーターのコンストラクターは、コピー コンストラクター (他の回答で説明されています) にするか、マークする必要がありますexplicit
。暗黙的な変換を提供するコンストラクターは慎重に使用する必要があります。
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
コンストラクターの 1 つはコピー コンストラクターで、もう 1 つは単なる通常のコンストラクターです。
Foo
2 つ目は、ポインタから aを明示的に初期化する場合、または引数の受け渡しや関数の戻り値など、ポインタから右辺値へFoo
の変換が必要なその他の状況で呼び出されます。Foo
Foo
通常、このような暗黙的な変換を行うことはお勧めできません。予期しないときに発生する可能性があり、コンパイルエラーによる些細なタイプミスが実行時の異常な動作に変わる可能性があります。