C には、非定数静的メンバーまたは静的配列の初期化を禁止する制限が存在します。クラス宣言内の配列。明確にするために、この制限の背後にある仕組みとその影響を詳しく見てみましょう。
C 言語標準では、静的定数整数型または列挙型のみを初期化できると明示的に規定しています。クラス定義時に初期化されます。たとえば、提供されているコード スニペットでは、静的データ メンバー a は初期化できる const int 型ですが、b などの他のメンバーは初期化できません。
この制限は、静的メンバーが複数のメンバー間で共有されるという事実に起因します。クラスのすべてのインスタンス。一意性と一貫性を確保するために、標準では、すべての静的メンバーがクラス宣言の外に単一の明確に定義された定義を持つことが求められています。
上記の原則の拡張、c のような定数配列であっても、静的配列に対してクラス内初期化は許可されません。静的メンバーと同様に、静的配列にはクラスのすべてのインスタンス間で一貫性を維持するための一意の定義が必要です。初期化子は宣言の一部であるため、クラス内で試行すると複数の定義が必要になります。
クラス宣言内の配列に対するこの初期化制限を回避するには、次のようにします。 「Enum トリック」を使用できます。これには、必要な配列サイズで列挙を定義し、その後それを配列のインデックスとして使用することが含まれます。
C 標準によって課される前述の制限には、いくつかの影響があります。
その後の改訂版言語、つまり C 11 では、静的データ メンバーの初期化に関する制限がある程度緩和されました。 「const リテラル型」の静的データ メンバーをクラス宣言内で初期化できるようになりました。 「リテラル型」とは、ユーザー定義のセマンティクスを持たない int や char などのプリミティブ型を指します。
ただし、静的配列は依然としてクラス宣言内での初期化が制限されており、クラス外での一意の定義の必要性が強調されています。 .
以上がC クラス内で非定数の静的メンバーと配列を初期化できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。