(暗黙)defaultcopy constructorをclassに対して呼び出すことができますかすでにユーザー定義コンストラクタがありますが、それはコピーコンストラクタではありません?
可能であれば、クラスのコピーコンストラクターを明示的に定義すると、今では(暗黙の)デフォルトコンストラクターを呼び出すことができますか?
まず、ボキャブラリーを少し明確にしましょう。デフォルトのコンストラクターは、引数なしで呼び出すことができるコンストラクターです。コピーコンストラクターは、同じ型の単一の引数で呼び出すことができるコンストラクターです。これを考えると、「デフォルトのコピーコンストラクター」は、次のような署名を持つコンストラクターになります。
class MyClass
{
public:
static MyClass ourDefaultInstance;
// default copy constructor...
MyClass( MyClass const& other = ourDefaultInstance );
};
どういうわけか、これがあなたの言っていることだとは思いません。 I 思考あなたが求めているのは、暗黙的に宣言された、または暗黙的に定義されたコピーコンストラクタです。宣言または定義がコンパイラーによって暗黙的に提供されるコピーコンストラクター。コピーコンストラクターと見なすことができるものの宣言を提供しない限り、コンパイラーは常に宣言を提供します。他のコンストラクターを提供しても、コンパイラーがコピーコンストラクターを暗黙的に宣言することは妨げられません。
これはデフォルトのコンストラクターとは異なります。-anyユーザー定義のコンストラクターは、コンパイラーが暗黙的にデフォルトのコンストラクターを宣言するのを防ぎます。つまり、ユーザー定義のコピーコンストラクターがある場合、コンパイラーはデフォルトのコンストラクターを暗黙的に宣言しません。
2番目の重要な点は、コンストラクターを呼び出さないことです。コンパイラは、特定の明確に定義されたコンテキストで変数を呼び出します:主に変数定義と型変換コンパイラーは、宣言されたコンストラクター(暗黙的に宣言されたコンストラクターを含む)のみを呼び出すことができます。したがって、ユーザー定義のコンストラクター(コピーまたはその他)があり、デフォルトのコンストラクターを定義しない場合、コンパイラーは、呼び出すための引数があるコンテキストを除き、コンストラクターを呼び出すことができません。
私があなたの質問だと思うことをまとめると、クラスが他のユーザー定義のコンストラクターを持っている場合でも、コンパイラーは暗黙的なコピーコンストラクターを提供します。また、ユーザー定義のコピーコンストラクターを提供する場合、コンパイラーはnot暗黙的に宣言されたデフォルトコピーコンストラクターを提供します。
http://www.cplusplus.com/articles/y8hv0pDG/
定義していない場合、デフォルトのコピーコンストラクターが存在します。そのため、コピーコンストラクターを定義していない場合はデフォルトのコピーコンストラクターを呼び出すことができますが、クラスでコピーコンストラクターを定義した場合は、デフォルトのコピーコンストラクターを呼び出すことはできません。
デフォルトのコピーコンストラクターなどはありません。デフォルトのコンストラクターとコピーコンストラクターがあり、それらは異なるものです。
暗黙的に定義されたコピーコンストラクター( "デフォルトコピーコンストラクター"の意味)は、既定のコンストラクターではなく、コピーコンストラクターを使用してクラス型の非静的メンバーをコピーします。暗黙的に定義されたコピーコンストラクターは、独自のコピーコンストラクターを定義しない場合に使用されます。