2

私の知る限り、自分でコンストラクターを宣言しないと、暗黙のデフォルト コンストラクターが取得されます。就職面接の質問として、コンストラクターを宣言していないが、暗黙のデフォルト コンストラクターも取得していない状況について尋ねられました。したがって、コンストラクターのないクラスになります。コンパイルされるコードであると想定されているため、答えは、それ自体がデフォルトのコンストラクターを提供しないメンバー変数を持たないことです。何か案は?スタック オーバーフローやさまざまな C++ サイトを検索しても、何も明らかになりませんでした。また、ヒントとしてインタビュアーは継承とは関係ないと言っていました。

4

3 に答える 3

3

私の標準の読みが正しければ、デフォルトのコンストラクターが使用されていなければ、暗黙的に定義されることはありません。

C ++ 11 12.1.6:

デフォルトであり、削除済みとして定義されていないデフォルトコンストラクターは、クラスタイプ(1.8)のオブジェクトを作成するためにodr-used(3.2)で使用される場合、または最初の宣言後に明示的にデフォルト設定される場合に暗黙的に定義されます。

また、デフォルトのコンストラクターは「削除済み」、C ++1112.1.5として定義できます。

クラスXのデフォルトのデフォルトコンストラクタは、次の場合に削除済みとして定義されます。

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

たとえば、上記のことから、次のプログラムは整形式であるように見えます。

struct X {
  X(int) {}
};

struct Y {
  X x;
};

Y使用されておらず、削除済みとして定義されているため、ここには暗黙的に定義されたデフォルトコンストラクタはありません。

于 2012-12-17T21:09:00.493 に答える
0

いいえ、質問の正確な文言に問題がない限り、そのようなトリックはありません。

12.1p5:

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

暗黙的に宣言された既定のコンストラクターは、削除済みとして定義される場合がありますが、それでもクラスのメンバーです。

于 2012-12-17T21:22:42.217 に答える
0

有効な C++、項目 5: 「これらの関数 [ctor、dtor、コピー ctor、コピー代入演算子] は、必要な場合にのみ生成されます [...]」

それによると、宣言された ctor を持たないクラスがあり、そのクラスのインスタンスを作成しない場合、クラスにはコンストラクターがまったくありません。

于 2012-12-17T21:35:38.930 に答える