web-dev-qa-db-ja.com

デフォルトのコピーコンストラクタ

(暗黙)defaultcopy constructorclassに対して呼び出すことができますかすでにユーザー定義コンストラクタがありますが、それはコピーコンストラクタではありません

可能であれば、クラスのコピーコンストラクターを明示的に定義すると、今では(暗黙の)デフォルトコンストラクターを呼び出すことができますか?

32
sourabh912

まず、ボキャブラリーを少し明確にしましょう。デフォルトのコンストラクターは、引数なしで呼び出すことができるコンストラクターです。コピーコンストラクターは、同じ型の単一の引数で呼び出すことができるコンストラクターです。これを考えると、「デフォルトのコピーコンストラクター」は、次のような署名を持つコンストラクターになります。

class MyClass
{
public:
    static MyClass ourDefaultInstance;
    //  default copy constructor...
    MyClass( MyClass const& other = ourDefaultInstance );
};

どういうわけか、これがあなたの言っていることだとは思いません。 I 思考あなたが求めているのは、暗黙的に宣言された、または暗黙的に定義されたコピーコンストラクタです。宣言または定義がコンパイラーによって暗黙的に提供されるコピーコンストラクター。コピーコンストラクターと見なすことができるものの宣言を提供しない限り、コンパイラーは常に宣言を提供します。他のコンストラクターを提供しても、コンパイラーがコピーコンストラクターを暗黙的に宣言することは妨げられません。

これはデフォルトのコンストラクターとは異なります。-anyユーザー定義のコンストラクターは、コンパイラーが暗黙的にデフォルトのコンストラクターを宣言するのを防ぎます。つまり、ユーザー定義のコピーコンストラクターがある場合、コンパイラーはデフォルトのコンストラクターを暗黙的に宣言しません。

2番目の重要な点は、コンストラクターを呼び出さないことです。コンパイラは、特定の明確に定義されたコンテキストで変数を呼び出します:主に変数定義と型変換コンパイラーは、宣言されたコンストラクター(暗黙的に宣言されたコンストラクターを含む)のみを呼び出すことができます。したがって、ユーザー定義のコンストラクター(コピーまたはその他)があり、デフォルトのコンストラクターを定義しない場合、コンパイラーは、呼び出すための引数があるコンテキストを除き、コンストラクターを呼び出すことができません。

私があなたの質問だと思うことをまとめると、クラスが他のユーザー定義のコンストラクターを持っている場合でも、コンパイラーは暗黙的なコピーコンストラクターを提供します。また、ユーザー定義のコピーコンストラクターを提供する場合、コンパイラーはnot暗黙的に宣言されたデフォルトコピーコンストラクターを提供します。

90
James Kanze

http://www.cplusplus.com/articles/y8hv0pDG/

定義していない場合、デフォルトのコピーコンストラクターが存在します。そのため、コピーコンストラクターを定義していない場合はデフォルトのコピーコンストラクターを呼び出すことができますが、クラスでコピーコンストラクターを定義した場合は、デフォルトのコピーコンストラクターを呼び出すことはできません。

11
CrazyCasta

デフォルトのコピーコンストラクターなどはありません。デフォルトのコンストラクターとコピーコンストラクターがあり、それらは異なるものです。

暗黙的に定義されたコピーコンストラクター( "デフォルトコピーコンストラクター"の意味)は、既定のコンストラクターではなく、コピーコンストラクターを使用してクラス型の非静的メンバーをコピーします。暗黙的に定義されたコピーコンストラクターは、独自のコピーコンストラクターを定義しない場合に使用されます。

3
NullPoiиteя