ご存知のように、コンストラクターが宣言されている場合(コピーコンストラクターを含む)、デフォルトのコンストラクター(引数をとらないコンストラクター)は暗黙的に作成されません。デフォルトのコピーコンストラクター(オブジェクトの浅いコピーを実行するコンストラクター)でも同じことが起こりますか?また、デストラクタの存在はこれに影響しますか?
5 に答える
12.8#4クラスオブジェクトのコピー
クラス定義でコピーコンストラクターが明示的に宣言されていない場合は、暗黙的に宣言されます。
そして、デストラクタは何の役割も果たしません
ここでの答えは正しいですが、完全ではありません。これらはC++98およびC++03に適しています。C ++ 11では、ムーブコンストラクターまたはムーブ代入演算子を宣言している場合、コピーコンストラクターは取得されません。さらに、コピー代入演算子またはデストラクタを宣言した場合、コピーコンストラクタの暗黙的な生成は非推奨になります。12.8 [class.copy]:
クラス定義でコピーコンストラクターが明示的に宣言されていない場合、ユーザー宣言のムーブコンストラクターがなく、ユーザー宣言のムーブ代入演算子がない場合、コピーコンストラクターは暗黙的にデフォルトとして宣言されます(8.4.2)。このような暗黙の宣言は、クラスにユーザー宣言のコピー代入演算子またはユーザー宣言のデストラクタがある場合は非推奨になります。
いいえ、注意してください
MyClass
{
template <typename T> MyClass(const T&);
};
コピーコンストラクターを提供せず、デフォルトのコンストラクターが生成されます。
いいえ。独自のコピーコンストラクタを提供しない限り、デフォルトのコピーコンストラクタを取得します。デストラクタの有無に違いはありません。
独自のコピーコンストラクターを定義しない限り、デフォルトのコピーコンストラクターは常に作成されます。引数のないコンストラクターは、他のコンストラクターが存在する状態で定義されていないため、呼び出されないため、実際のコンストラクターのコードがスキップされます。