C が Const オブジェクトのデフォルト初期化にユーザー提供のコンストラクターを必要とする理由
C 標準では、オブジェクトのデフォルト初期化時に次のように規定されています。 const 修飾型の場合、その型にはユーザー指定のデフォルト コンストラクターが必要です。この要件は、POD (Plain Old Data) の概念と C におけるオブジェクトの初期化の間の相互作用により発生します。
C では、非 POD クラスのオブジェクトはデフォルトで初期化されます。ただし、コンストラクター、バリデーター、デストラクターのない軽量のデータ型である POD は、デフォルトでは初期化されません。これは、POD が、明示的な初期化の方が効率的であるパフォーマンス重視のシナリオ向けに設計されているためです。
const 修飾型のオブジェクトを初期化する場合、標準では、オブジェクトが確実に初期化できるように、ユーザー提供のコンストラクターが義務付けられています。初期化された。これが必要なのは、基礎となるクラスがコンストラクターのない POD である場合、オブジェクトが初期化されないままになり、役に立たなくなるためです。
コード例を考えてみましょう。
struct B { B() : x(42) {} int doSomeStuff() const { return x; } int x; }; struct A { A() {} // Why is this required? B b; // Just for illustration }; int main() { const A a; }
このコードでは、オブジェクト a は const 修飾されています。 A クラスにユーザー提供のコンストラクターがなかった場合、それは POD とみなされます。 POD はデフォルトでは初期化されないため、 a は初期化されず、コードが無効になります。
ただし、A クラスにはユーザー提供のコンストラクターがあるため、非 POD になります。したがって、コンストラクターを呼び出すことによって a はデフォルトで初期化され、コードは正常にコンパイルされます。
ユーザー提供のコンストラクターに対する標準の要件は、const 修飾型のオブジェクトが適切に初期化されて使用できることを保証することです。 .
以上がC の Const オブジェクトにユーザー定義のデフォルト コンストラクターが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。