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

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

Mary-Kate Olsen
リリース: 2024-12-06 03:29:10
オリジナル
215 人が閲覧しました

Why Can't I Directly Initialize Static Non-Const Members and Static Arrays in a C   Class?

クラス内の静的非定数メンバーおよび静的配列の初期化の問題

C では、クラス定義内で非定数静的メンバーまたは静的配列を直接初期化しようとします多くの場合、コンパイラ エラーが発生します。この記事では、これらの制限の背後にある理由を検証し、必要な機能を実現するための回避策を示します。

クラスで静的データ メンバーを初期化できないのはなぜですか?

C 標準によれば、静的データ メンバーは次のようにできます。 const 整数型または列挙型の場合にのみ、クラス定義内で初期化されます。この制限により、次のことが保証されます。

  • 一意の定義: クラス定義は通常、ヘッダー ファイルに含まれており、複数の翻訳単位に組み込むことができます。オブジェクト定義の重複を防ぐために、C ではすべてのオブジェクトに一意の定義が必要です。メモリ内ストレージを必要とするオブジェクトのクラス内初期化は、このルールに違反します。

なぜ静的 const 整数型と列挙型のみが許可されるのですか?

  • Object Storage: 静的 const 整数メンバーはコンパイル時の定数として扱われ、コンパイラーによって最適化できます。クラス内初期化を許可することで、コンパイラはそれらをメモリに格納する必要をなくすことができ、前述の制限を回避できます。
  • 強制性: 列挙型は、このクラス内初期化を許可されています。値は整数の代わりに直接使用できます。

の静的配列はどうでしょうか。 class?

静的な非 const メンバーに適用されるのと同じ理由で、静的配列のクラス内初期化は禁止されています。さらに、クラス内で静的 const 配列を初期化することさえも許可されません。

  • 制限された定数: 静的 const 配列は、要素に関してのみ定数であり、サイズではありません。これは、コンパイラがそれらをコンパイル時の定数として扱い、効率的に最適化できないことを意味します。

回避策

クラス内の静的配列または非 const メンバーを初期化するには、次の手法を使用できます。採用される:

  • 列挙型のトリック: 列挙型を使用する配列サイズと要素の定義された定数を使用します。
  • クラス外定義: 名前空間スコープ内のクラス定義の外で静的変数を定義し、両方の非 const 静的メンバーを許可します。

C 11 Evolution

C 11 は、クラス宣言内での非静的データ メンバーの初期化と、定数式を使用した静的 const リテラル メンバーの初期化を許可することによる制限。ただし、これらの機能はまだすべてのコンパイラでサポートされているわけではありません。

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

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