ホームページ > バックエンド開発 > C++ > C クラス内で非定数の静的メンバーと配列を初期化できないのはなぜですか?

C クラス内で非定数の静的メンバーと配列を初期化できないのはなぜですか?

Barbara Streisand
リリース: 2024-12-14 16:33:12
オリジナル
428 人が閲覧しました

Why Can't I Initialize Non-Constant Static Members and Arrays Inside a C   Class?

クラス内の非定数静的メンバーおよび配列を初期化できないことを理解する

C には、非定数静的メンバーまたは静的配列の初期化を禁止する制限が存在します。クラス宣言内の配列。明確にするために、この制限の背後にある仕組みとその影響を詳しく見てみましょう。

静的データ メンバーを初期化できない理由

C 言語標準では、静的定数整数型または列挙型のみを初期化できると明示的に規定しています。クラス定義時に初期化されます。たとえば、提供されているコード スニペットでは、静的データ メンバー a は初期化できる const int 型ですが、b などの他のメンバーは初期化できません。

この制限は、静的メンバーが複数のメンバー間で共有されるという事実に起因します。クラスのすべてのインスタンス。一意性と一貫性を確保するために、標準では、すべての静的メンバーがクラス宣言の外に単一の明確に定義された定義を持つことが求められています。

静的配列を初期化できない理由

上記の原則の拡張、c のような定数配列であっても、静的配列に対してクラス内初期化は許可されません。静的メンバーと同様に、静的配列にはクラスのすべてのインスタンス間で一貫性を維持するための一意の定義が必要です。初期化子は宣言の一部であるため、クラス内で試行すると複数の定義が必要になります。

回避策: Enum トリック

クラス宣言内の配列に対するこの初期化制限を回避するには、次のようにします。 「Enum トリック」を使用できます。これには、必要な配列サイズで列挙を定義し、その後それを配列のインデックスとして使用することが含まれます。

標準の制限の影響

C 標準によって課される前述の制限には、いくつかの影響があります。

  • すべての静的メンバーと配列に単一の、明確な定義。
  • 静的エンティティの複数の定義から生じる潜在的な競合を防止します。
  • 静的定数積分はコンパイル中に解決できるため、コンパイラーが静的定数積分を最適化し、コード効率を向上させることができます。

C 11 の緩和

その後の改訂版言語、つまり C 11 では、静的データ メンバーの初期化に関する制限がある程度緩和されました。 「const リテラル型」の静的データ メンバーをクラス宣言内で初期化できるようになりました。 「リテラル型」とは、ユーザー定義のセマンティクスを持たない int や char などのプリミティブ型を指します。

ただし、静的配列は依然としてクラス宣言内での初期化が制限されており、クラス外での一意の定義の必要性が強調されています。 .

以上がC クラス内で非定数の静的メンバーと配列を初期化できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート