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

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

Linda Hamilton
リリース: 2024-12-06 05:00:11
オリジナル
281 人が閲覧しました

Why Can't Non-Const Static Members or Static Arrays Be Initialized Inside a Class Definition in C  ?

クラス内で非 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 サイトの他の関連記事を参照してください。

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