ホームページ >バックエンド開発 >C++ >`const` オブジェクトをデフォルトで構築するために、C クラスにユーザー定義のデフォルト コンストラクターが必要なのはなぜですか?

`const` オブジェクトをデフォルトで構築するために、C クラスにユーザー定義のデフォルト コンストラクターが必要なのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-29 10:10:11533ブラウズ

Why Must C   Classes Have a User-Defined Default Constructor to Default-Construct a `const` Object?

C では、const オブジェクトをデフォルトで構築するためにユーザー提供のデフォルト コンストラクターが必要なのはなぜですか?

C 標準では、プログラムがconst 修飾型のオブジェクトのデフォルトの初期化を呼び出す場合、基になるクラス型はユーザーが提供するデフォルトのコンストラクター。この要件は、

  • POD (Plain Old Data) クラスにはデフォルトの初期化が欠落しているという事実から生じています。 POD クラスにユーザー定義のコンストラクターが装備されていない場合、それはデフォルトで初期化することができます。ただし、初期化が行われていない POD オブジェクトは、状態が不定のままであるため、実用的な目的はありません。
  • Const オブジェクトは即時初期化を必要とします: POD オブジェクトとは異なり、const オブジェクトは状態を変更できないため、即時初期化が必要です。確立されると変更されます。 POD 型の const オブジェクトが初期化されないまま放置されている場合、その値は変更できないため役に立ちません。

この困難を避けるために、標準では、次の条件が満たされていない POD 型から const オブジェクトを構築することはできないと規定されています。ユーザーが提供するデフォルトのコンストラクター。これにより、const オブジェクトが作成時に常に初期化されることが保証されます。

POD クラスと非 POD クラスの区別

明確にするために、標準の要件は、非 POD クラスの const オブジェクトに特に適用されます。 -PODクラス。 POD クラスには、仮想関数や基本クラスがなく、それ自体が POD であるデータ メンバーがあり、ユーザー定義のコンストラクターがなくてもデフォルトで初期化できます。対照的に、非 POD クラスでは、デフォルトの初期化を有効にするためにユーザーが提供するデフォルト コンストラクターが必要です。

説明例

次のコード スニペットを考えてみましょう:

struct B {
  B(): x(42) {}
  int doSomeStuff() const { return x; }
  int x;
};

struct A {
  A() {} // Required by the standard
  B b; // Illustration purpose
};

int main() {
  const A a; // Valid due to user-provided default constructor in A.
}

この例では、構造体 A の const オブジェクト 'a' はデフォルトで構築できます。ユーザー提供のデフォルト コンストラクターがあり、非 POD クラスに対する標準の要件を満たします。

以上が`const` オブジェクトをデフォルトで構築するために、C クラスにユーザー定義のデフォルト コンストラクターが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。