1

n3290ドラフト§12.1(コンストラクター)からのポイント¶5:

暗黙的に宣言されたデフォルトコンストラクターは、inline publicそのクラスのメンバーです。クラスのデフォルトのデフォルトコンストラクタXは、次の場合に削除済みとして定義されます。

  • Xは、自明ではないデフォルトのコンストラクターを持つバリアントメンバーを持つユニオンのようなクラスです。
  • ブレースまたはイコールイニシャライザーのない非静的データメンバーは、参照型であり、
  • brace-or-equal-initializerを持たないconst-qualified型(またはその配列)の非バリアント非静的データメンバーには、ユーザー提供のデフォルトコンストラクターがありません。
  • Xはユニオンであり、そのバリアントメンバーはすべてconst修飾型(またはその配列)であり、
  • Xは非ユニオンクラスであり、匿名ユニオンメンバーのすべてのメンバーはconst修飾型(またはその配列)であり、
  • 直接または仮想の基本クラス、または中括弧または等しい初期化子を持たない非静的データメンバーは、クラスタイプM(またはその配列)を 持ち、デフォルトのコンストラクターまたはデフォルトのMコンストラクターに適用されるオーバーロード解決(13.3)を持ちません。M結果として、あいまいさ、またはデフォルトのデフォルトコンストラクターから削除された、またはアクセスできない関数、または
  • 直接または仮想の基本クラスまたは非静的データメンバーは
    、デフォルトのデフォルトコンストラクタから削除またはアクセスできないデストラクタを持つタイプを持っています

デフォルトのデフォルトコンストラクタをいくつかのサンプルプログラムで説明してください。

4

2 に答える 2

2

ウィキペディアからのこの抜粋はこれを説明している と思います:

明示的にデフォルト設定および削除された特殊メンバー関数

C ++ 03では、コンパイラーは、それ自体を提供しないクラスに対して、デフォルトコンストラクター、コピーコンストラクター、コピー代入演算子(operator =)、およびデストラクタを提供します。プログラマーは、カスタムバージョンを定義することにより、これらのデフォルトをオーバーライドできます。C ++は、プログラマーがオーバーライドできるすべてのクラスで機能するいくつかのグローバル演算子(operator=やoperatornewなど)も定義します。

ただし、これらのデフォルトの作成を制御することはほとんどできません。たとえば、クラスを本質的にコピー不可にするには、プライベートコピーコンストラクターとコピー代入演算子を宣言し、それらを定義しない必要があります。これらの関数を使用しようとすると、単一定義規則に違反します。診断メッセージは必要ありませんが、[5]これにより、通常、リンカーエラーが発生します。[要出典]

デフォルトのコンストラクターの場合、クラスがコンストラクターで定義されていると、コンパイラーはデフォルトのコンストラクターを生成しません。これは多くの場合に役立ちますが、特殊なコンストラクターとコンパイラーによって生成されたデフォルトの両方を使用できることも役立ちます。

C ++ 11では、これらの特別なメンバー関数の明示的なデフォルト設定と削除が可能になります。たとえば、次の型は、デフォルトのコンストラクターを使用していることを明示的に宣言しています。

コード例:

struct SomeType 
{
    SomeType() = default; //The default constructor is explicitly stated.
    SomeType(OtherType value);
};

あなたはスタンダーディーのファンのようです(ほとんどすべての質問は標準引用符の説明を求めています)ここで、標準がデフォルトおよび削除された関数の定義にどのように到達するかについてのこのペーパーはあなたにとって良い読み物です:

デフォルトおよび削除された関数

于 2011-09-19T10:38:07.797 に答える
0

= default;特別なメンバー関数の1つは、構文で宣言されている場合、「デフォルト」になります。引用した最初の行の直前の行は次のように述べています。

クラスXのユーザー宣言コンストラクターがない場合、パラメーターを持たないコンストラクターは、デフォルトとして暗黙的に宣言されます(8.4)。

したがって、「デフォルト」のデフォルトコンストラクターは、で宣言されたデフォルトコンストラクター(引数なしで呼び出すことができるコンストラクター)です= default。これは、= default構文を使用して明示的に定義することも、上記の行に従って暗黙的に定義することもできます。

于 2011-09-19T10:38:33.293 に答える