C 11 のクラス内初期化: 非静的および非定数メンバーの制限を緩和
C 11 より前のクラス内初期化静的 const 整数型または列挙型のメンバーに制限されていました。この制限の背後にある理由は、複雑なリンカー ルールを回避しながら、複数の翻訳単位にわたってオブジェクトの一意の定義を維持する必要があるということでした。
しかし、C 11 ではこれらの制限が緩和され、非静的メンバーのクラス内初期化が可能になります (§ 12.6.2/8)。これには、brace-or-equal-initializer を持つ非静的データ メンバーと、非抽象クラスの非仮想基本クラスが含まれます。
では、これを可能にするために何が変更されたのでしょうか?リンカーには大幅な変更は加えられませんでしたが、追加の責任を処理するためにコンパイラーはより複雑になりました。
複数の定義に厳密な規則を適用していた以前のバージョンの C とは異なり、C 11 のコンパイラーは、内部で複数の定義を処理するようになりました。クラス。定義の競合を解決するリンカーの代わりに、コンパイラーがこのタスクを引き受けます。
この責任の変更により、単一メンバーに対する複数のメンバーの初期化間の潜在的な競合を考慮する必要があるプログラマーにとって、より複雑な作業が発生します。たとえば、メンバー初期化子と、同じメンバーに特定の初期化を行うコンストラクターの両方を持つクラスでは、どの初期化を使用するかを決定するために慎重に検討する必要があります。
複雑さは増しますが、クラス内初期化の利点は次のとおりです。課題を上回ります。これにより、より簡潔で表現力豊かなコードが可能になり、定型文が減り、コードが読みやすく理解しやすくなります。
以上がC 11 では、どのようにして非静的メンバーおよび非定数メンバーのクラス内初期化が可能になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。