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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-12 21:07:18540ブラウズ

Why Can't Non-Const Static Members and Arrays Be Initialized Within a C   Class Definition?

クラス定義で静的データ メンバーと配列を初期化できない理由

非定数静的メンバー

C 標準では静的データの初期化が制限されていますクラス定義内のメンバーを静的定数整数または列挙のみに変換type.

class A {
  static const int a = 3;  // Allowed
  static int b = 3;       // Error: Non-const static member cannot be initialized in class definition
  static const int c[2] = {1, 2};  // Allowed
  static int d[2] = {1, 2};       // Error: Non-const static array cannot be initialized in class definition
};

この制限は、コンパイラによる静的データ メンバーの処理方法によるものです。すべての静的データ メンバーは一意の定義を持つ必要があり、クラス定義で初期化されると、クラスが複数の翻訳単位に含まれるときに複数の定義が作成されます。

静的配列

静的配列、定数配列であっても、そのサイズはコンパイル時に決定できないため、クラス定義で初期化できません。コンパイラは、配列にメモリを割り当てる前に、配列のサイズを知る必要があります。

「enum トリック」を使用した回避策

クラス定義で静的配列を初期化するには、 「列挙トリック」を使用できます:

class A {
  static const int a = 3;
  enum { arrSize = 2 };
  static const int c[arrSize] = {1, 2};
};

標準準拠理由

非定数静的メンバーの初期化に対する標準の制限は、あいまいな定義を防止し、翻訳単位全体で一意のメンバー定義を保証する必要があることから生じています。

静的配列に関しては、C 言語の設計が採用されています。はコンパイル時の効率を優先しており、メモリ割り当てを最適化するためにコンパイル時に配列サイズを把握する必要があります。ただし、C 11 では定数式の概念が導入され、コンパイル時に決定される値で const データ メンバーを初期化できるため、将来の C バージョンではより柔軟な対応が可能になる可能性があります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。