8

ご存知のように、コンストラクターが宣言されている場合(コピーコンストラクターを含む)、デフォルトのコンストラクター(引数をとらないコンストラクター)は暗黙的に作成されません。デフォルトのコピーコンストラクター(オブジェクトの浅いコピーを実行するコンストラクター)でも同じことが起こりますか?また、デストラクタの存在はこれに影響しますか?

4

5 に答える 5

9

12.8#4クラスオブジェクトのコピー

クラス定義でコピーコンストラクターが明示的に宣言されていない場合は、暗黙的に宣言されます。

そして、デストラクタは何の役割も果たしません

于 2011-04-11T09:44:30.737 に答える
6

ここでの答えは正しいですが、完全ではありません。これらはC++98およびC++03に適しています。C ++ 11では、ムーブコンストラクターまたはムーブ代入演算子を宣言している場合、コピーコンストラクターは取得されません。さらに、コピー代入演算子またはデストラクタを宣言した場合、コピーコンストラクタの暗黙的な生成は非推奨になります。12.8 [class.copy]:

クラス定義でコピーコンストラクターが明示的に宣言されていない場合、ユーザー宣言のムーブコンストラクターがなく、ユーザー宣言のムーブ代入演算子がない場合、コピーコンストラクターは暗黙的にデフォルトとして宣言されます(8.4.2)。このような暗黙の宣言は、クラスにユーザー宣言のコピー代入演算子またはユーザー宣言のデストラクタがある場合は非推奨になります。

于 2011-04-11T15:21:53.840 に答える
3

いいえ、注意してください

MyClass
{
    template <typename T> MyClass(const T&);
};

コピーコンストラクターを提供せず、デフォルトのコンストラクターが生成されます。

于 2011-04-11T09:36:24.143 に答える
3

いいえ。独自のコピーコンストラクタを提供しない限り、デフォルトのコピーコンストラクタを取得します。デストラクタの有無に違いはありません。

于 2011-04-11T09:31:43.277 に答える
1

独自のコピーコンストラクターを定義しない限り、デフォルトのコピーコンストラクターは常に作成されます。引数のないコンストラクターは、他のコンストラクターが存在する状態で定義されていないため、呼び出されないため、実際のコンストラクターのコードがスキップされます。

于 2011-04-11T09:34:00.347 に答える