クラス内で非 Const 静的メンバーまたは静的配列を初期化できないのはなぜですか?
クラス内では、静的データ メンバーを初期化できます。定数で整数型の場合にのみ初期化されます。この制限は、すべてのオブジェクトが一意の定義を持つという C 標準の要件から生じます。
非定数静的メンバーの初期化:
C 標準 (C 03 9.4 による) .2)、非 const 型の静的データ メンバーはクラス定義内で初期化できません。次のコードはこれを示しています。
class A { static int b = 3; };
このコードは標準に違反しており、静的メンバー b が非定数であり、クラス内で初期化しようとしているため、エラーが発生します。
静的配列の初期化:
同様に、静的配列は内部で初期化できません。クラス定義 (const であっても)。これは、静的配列がオブジェクトとしてメモリに格納されるためです。そのため、一意の定義の要件に違反するため、クラス定義内で初期化することはできません。
class A { static const int c[2] = { 1, 2 }; };
もう一度言いますが、このコードは標準に違反しており、エラーが発生します。
回避策と理由:
クラス内で静的配列を初期化するための回避策の 1 つは、 「列挙トリック」は次のとおりです。
class A { static const int a = 3; enum { arrsize = 2 }; static const int c[arrsize] = { 1, 2 }; };
静的データ メンバーのクラス内初期化が禁止されている理由は、クラス宣言を含むヘッダー ファイルが通常、複数の翻訳単位に含まれるという事実に関連しています。リンカーの問題を回避するために、C ではすべてのオブジェクトに一意の定義が必要です。メモリ常駐エンティティのクラス内初期化が許可されている場合、このルールは破られます。
しかし、C 11 では、制限がある程度緩和されました。静的データ メンバーが const リテラル タイプの場合、クラス定義内で brace-or-equal-initializer を使用して初期化できます。さらに、非静的データ メンバーを宣言時に初期化できるようになりました。これらの機能は、gcc 4.7 などのすべてのコンパイラーにまだ完全には実装されていません。
以上がC のクラス定義内で非 Const 静的メンバーまたは静的配列を初期化できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。