C のデフォルトで構築された Const オブジェクトにユーザー定義のデフォルト コンストラクターが必要なのはなぜですか?
C 標準では、セクション 8.5 で次のように規定されています。デフォルトで初期化された const オブジェクトの場合、その型はユーザー指定のデフォルトを持つクラスである必要があります。コンストラクター。この要件を理解するには、POD (Plain Old Data) クラスと非 POD クラスの区別を理解する必要があります。
POD クラスと非 POD クラス
POD クラスは次のとおりです。ユーザー定義のコンストラクター、デストラクター、または仮想メンバー関数はありません。これらは初期化されていないメモリで初期化できるため、効率的なメモリ割り当てと直接メモリ操作が可能になります。一方、
非 POD クラスは、POD 制約のいずれかに違反します。これらは使用前に初期化する必要があり、初期化されていないメモリで初期化しようとすると未定義の動作が発生します。
デフォルト コンストラクターの要件
標準ではユーザーの要件が強制されます。 - デフォルトで構築された const オブジェクトのデフォルト コンストラクターを提供なぜなら:
オブジェクト ユーティリティの確保: POD クラスにユーザー定義のコンストラクターがない場合、デフォルトでは初期化されないままになります。初期化されていない POD クラスの const オブジェクトを宣言すると、値を変更できないため、そのオブジェクトは役に立たなくなります。
POD p1; // uninitialized - can be assigned later const POD p2; // uninitialized - error, cannot be modified
非 POD 初期化の促進: User-定義されたコンストラクターはクラスを非 POD にします。非 POD クラスの const オブジェクトを宣言すると、初期化子が提供されているかどうかに関係なく、その初期化が保証されます。
nonPOD_B b1; // initialized const nonPOD_B b2; // initialized
したがって、default に対してユーザーが提供するデフォルト コンストラクターを要求することで、 C 標準では、構築された const オブジェクトが POD クラスの const オブジェクトであっても適切に初期化され、使用可能であることが保証されます。
以上がC でデフォルトで構築される Const オブジェクトにユーザー定義のデフォルト コンストラクターが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。